Co to są pozbawione i nie pozbawione plików wykonywalnych w systemie Unix?


37

Z pliku man ,

EXAMPLES
   $ file file.c file /dev/{wd0a,hda}
   file.c:   C program text
   file:     ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
             dynamically linked (uses shared libs), stripped
   /dev/wd0a: block special (0/0)
   /dev/hda: block special (3/0)
   $ file -s /dev/wd0{b,d}
   /dev/wd0b: data
   /dev/wd0d: x86 boot sector
   $ file -s /dev/hda{,1,2,3,4,5,6,7,8,9,10}
   /dev/hda:   x86 boot sector
   /dev/hda1:  Linux/i386 ext2 filesystem
   /dev/hda2:  x86 boot sector
   /dev/hda3:  x86 boot sector, extended partition table
   /dev/hda4:  Linux/i386 ext2 filesystem
   /dev/hda5:  Linux/i386 swap file
   /dev/hda6:  Linux/i386 swap file
   /dev/hda7:  Linux/i386 swap file
   /dev/hda8:  Linux/i386 swap file
   /dev/hda9:  empty
   /dev/hda10: empty

   $ file -i file.c file /dev/{wd0a,hda}
   file.c:      text/x-c
   file:        application/x-executable, dynamically linked (uses shared libs),
   not stripped
   /dev/hda:    application/x-not-regular-file
   /dev/wd0a:   application/x-not-regular-file

Co oznacza wykonywalny stripping?

Dlaczego niektóre pliki wykonywalne są usuwane, a inne nie?

Odpowiedzi:


50

Jeśli skompilujesz plik wykonywalny z flagą -g gcc, zawiera on informacje dotyczące debugowania. Oznacza to, że dla każdej instrukcji znajduje się informacja, który wiersz kodu źródłowego ją wygenerował, nazwa zmiennych w kodzie źródłowym zostaje zachowana i może być powiązana z pasującą pamięcią w czasie wykonywania itp. Strip może usunąć te informacje debugowania i inne zawarte w nim dane w pliku wykonywalnym, który nie jest konieczny do wykonania w celu zmniejszenia rozmiaru pliku wykonywalnego.


10
Zobacz także stronę paska (1) . Ogólnie pasek usuwa wszystkie symbole, ponieważ nie są one absolutnie konieczne; usuwa również informacje o debugowaniu, ale symbole są najważniejsze
Michael Mrozek

3
Koncepcja uogólnia się na większość formatów wykonywalnych, nie jest to specyficzne dla gcc, a nawet dla unixa.
Gilles 'SO - przestań być zły'

4
Miałem plik wykonywalny 40 MB, który po zmniejszeniu został zmniejszony do 6 MB - po prostu masz pojęcie o tym, ile miejsca zajmuje debugowanie danych.
Nathan Osman,

Czy więc usunięcie pliku wykonywalnego, z prog.ektórym został zbudowany, gcc -g -o prog.e prog.cdaje odpowiednik kompilacji gcc -O0 -o prog.e prog.c?
ysap,

1
@ysap nie, nie ma to nic wspólnego z optymalizacją (-O). Kod zestawu pozostaje taki sam, niezależnie od tego, czy plik jest usuwany, czy nie. Otrzymujesz plik wykonywalny bez informacji o debugowaniu (więc masz rację co do utraty „-g”) i bez wszystkich symboli (tj. Nazw funkcji, nazw zmiennych globalnych ...). Jest to odpowiednik „gcc -s -o prog.e prog.c”. Podczas wykonywania programu symbole nie mają znaczenia. Ale na przykład zastrzeżone oprogramowanie zawsze usuwa symbole, ponieważ w przeciwnym razie wszyscy mogliby znać oryginalne nazwy funkcji i ich lokalizacji.
Pikrass
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.