Teile des Dateiheaders

Teile des Dateiheaders

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_PAGEDdas 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.hoderHier.

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 objdumpBefehls 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, gdbsodass 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.

verwandte Informationen