Ich habe meine C-Programme durchgearbeitet, bin neu in der Linux/UNIX-Entwicklung und habe mich umgesehen.
Ich habe ein einfaches „Hallo Welt“-C-Programm erstellt und den Kompilierungsprozess überprüft.
Ich habe versucht, den Dateikopf der endgültigen ausführbaren Datei zu lesen und habe die folgende Ausgabe erhalten
$ objdump -f my_output
file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048320**
Ich verstehe den Teil zu elf32-i386, bin mir aber bei den anderen Teilen des Headers nicht ganz sicher.
hat D_PAGED
das etwas mit der Paging-Anforderung zu tun? Und was bedeutet das
EXEC_P, HAS_SYSMS
? Ist die Startadresse die logische Adresse des main()
Programms?
Antwort1
Die Flags in der Ausgabe sindBFD - Binäre Dateideskriptoren. Sie sind Teil des Binutils-Pakets. Sie können die Bedeutung der Flags nachlesen, indem Sie in der BFD-Headerdatei nachsehen /usr/include/bfd.h
oderHier.
Der Verweis auf die „Flaggen“0x00000112ist das, was man einFlaggenfeld. Es ist binär und jedes Bit stellt eine bestimmte Funktion dar. Eine Eins bedeutet, dass die Flagge aktiviert oder gesetzt ist, und eine Null bedeutet, dass sie es nicht ist. Beachten Sie auch, dass „0x...“ bedeutet, dass es sich um einen hexadezimalen Wert handelt. Wenn Sie es also von HEX in BIN umwandeln:
0x00000112 = 0001 0001 0010 im Binärformat.
Daher werden die Flags gesetzt, die dem 2., 5. und 9. Bit im Flag-Feld entsprechen. Dies sind die Flags, die in der 3. Ausgabezeile des objdump
Befehls namentlich angezeigt werden.
Bedeutung von Flaggen
Die 3 Flags, die Ihre ausführbare Datei hat, sind ziemlich standardmäßig. Lesen Sie die Bits von rechts nach links!
1. Bit - 0000 0000 0010
/* BFD is directly executable. */
#define EXEC_P 0x02
2. Bit - 0000 0001 0000
/* BFD has symbols. */
#define HAS_SYMS 0x10
3. Bit - 0001 0000 0000
/* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the
linker sets this by default, but clears it for -r or -n or -N). */
#define D_PAGED 0x100
Das Fazit:
- Dies ist eine ausführbare Datei
- Es enthält eine Symboltabelle, wenn Sie es mit GNU Debugger debuggen möchten,
gdb
sodass die Funktionen aussagekräftige Namen haben - die ausführbare Datei wird dynamisch mit den Standardbibliotheken wie glibc usw. verknüpft.
Startadresse
Die letzte Zeile, Startadresse ..., ist, wie Sie es vermutet haben, die Stelle, an der der eigentliche .CODE für die ausführbare Datei beginnt.