Parties du file En-tête

Je travaillais à travers mes programmes C, je suis nouveau dans le développement Linux / UNIX et jeta un coup d'œil.

J'ai créé un programme C simple de Hello World et j'examinais le process de compilation.

J'ai essayé de lire l'en-tête du file de l'exécutable final et j'ai obtenu la sortie comme ceci

$ objdump -f my_output file format elf32-i386 architecture: i386, flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED start address 0x08048320** 

Je comprends la partie elf32-i386 mais je ne suis pas sûr avec les autres parties de l'en-tête.

est D_PAGED quelque sorte liée à la request de pagination? et qu'est-ce que EXEC_P, HAS_SYSMS signifie? est l'adresse de départ, l'adresse logique de main() du programme?

Les drapeaux de la sortie sont BFD – Descripteurs de files binarys . Ils font partie du package binutils, vous pouvez lire ce que signifient les drapeaux si vous regardez dans le file d'en-tête /usr/include/bfd.h pour leur signification ou ici .

La reference à la "drapeaux" 0x00000112 est ce qu'on appelle un champ de drapeau . Il est binary et chaque bit représente une caractéristique particulière, un signifie que le drapeau est activé ou défini et un zéro signifie que ce n'est pas le cas. Notez également que le "0x …" signifie qu'il s'agit d'une valeur hexadécimale, donc si vous le convertissez de HEX en BIN:

0x00000112 = 0001 0001 0010 en binary.

Ainsi, les drapeaux correspondant aux 2ème, 5ème et 9ème bits du champ drapeau sont définis. Ce sont les drapeaux qui sont affichés par leur nom dans la 3ème ligne de sortie de la command objdump .

Signification des drapeaux

Les 3 drapeaux que votre exécutable a sont assez standard. Lisez les bits de droite à gauche!

1er bit – 0000 0000 0010

  /* BFD is directly executable. */ #define EXEC_P 0x02 

2ème bit – 0000 0001 0000

  /* BFD has symbols. */ #define HAS_SYMS 0x10 

3ème 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 

Donc, le take aways:

  • Ceci est un file exécutable
  • il inclut une table de symboles si vous voulez le déboguer en utilisant Gnu Debugger, gdb , de sorte que les fonctions auront des noms significatifs
  • l'exécutable est lié dynamicment aux bibliothèques standard telles que glibc etc.

Adresse de départ

La dernière ligne, adresse de départ …, est comme vous l'avez deviné, où le .CODE réel commence pour l'exécutable.