Was sind in Unix entfernte und nicht entfernte ausführbare Dateien?

37

Aus der Man-Datei ,

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

Was bedeutet ausführbares Entfernen?

Warum werden einige der ausführbaren Dateien entfernt, andere nicht?

Laser
quelle

Antworten:

50

Wenn Sie eine ausführbare Datei mit dem Flag -g von gcc kompilieren, enthält sie Debugging-Informationen. Das heißt, für jeden Befehl gibt es Informationen, in welcher Zeile des Quellcodes er generiert wurde, der Name der Variablen im Quellcode bleibt erhalten und kann zur Laufzeit dem passenden Speicher zugeordnet werden usw. Strip kann diese Debugging-Informationen und andere darin enthaltene Daten entfernen in der ausführbaren Datei, die für die Ausführung nicht erforderlich ist, um die Größe der ausführbaren Datei zu verringern.

fschmitt
quelle
10
Siehe auch die Manpage strip (1) . In der Regel werden durch das Entfernen von Streifen alle Symbole entfernt, da sie nicht unbedingt erforderlich sind. es werden auch Debugging-Informationen entfernt, aber Symbole sind die Hauptsache
Michael Mrozek
3
Das Konzept lässt sich auf die meisten ausführbaren Formate verallgemeinern. Dies ist nicht spezifisch für gcc oder sogar für Unix.
Gilles 'SO - hör auf, böse
4
Ich hatte eine ausführbare Datei mit 40 MB, die beim Entfernen auf 6 MB reduziert wurde - damit Sie einen Eindruck davon bekommen, wie viel Speicherplatz das Debuggen von Daten beansprucht.
Nathan Osman
Entspricht das Entfernen einer ausführbaren Datei prog.e, die mit erstellt wurde gcc -g -o prog.e prog.c, dem Kompilieren mit gcc -O0 -o prog.e prog.c?
ysap
1
@ysap nein, es hat nichts mit der Optimierung (-O) zu tun. Der Assembler-Code bleibt gleich, unabhängig davon, ob die Datei entfernt wurde oder nicht. Sie erhalten eine ausführbare Datei ohne die Debugging-Informationen (damit haben Sie Recht mit dem Verlust von "-g") und ohne alle Symbole ( dh Funktionsnamen, globale Variablennamen ...). Es ist das Äquivalent von "gcc -s -o prog.e prog.c". Wenn ein Programm ausgeführt wird, machen Symbole keinen Unterschied. Bei proprietärer Software sind die Symbole jedoch immer entfernt, da sonst jeder die ursprünglichen Namen der Funktionen und ihre Positionen kennen könnte.
Pikrass