Partes do arquivo Cabeçalho

Partes do arquivo Cabeçalho

Eu estava trabalhando em meus programas C, sou novo no desenvolvimento de Linux/UNIX e estava dando uma olhada.

Criei um programa C simples de Hello world e estava inspecionando o processo de compilação.

Tentei ler o cabeçalho do arquivo executável final e obtive a saída como esta

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

Entendo a parte elf32-i386, mas não tenho muita certeza das outras partes do cabeçalho.

está D_PAGEDde alguma forma relacionado à paginação por demanda? e o que EXEC_P, HAS_SYSMSsignifica? é o endereço inicial, o endereço lógico do main()programa?

Responder1

Os sinalizadores na saída sãoBFD - descritores de arquivos binários. Eles fazem parte do pacote binutils, você pode ler o que os sinalizadores significam se procurar no arquivo de cabeçalho bfd /usr/include/bfd.hseu significado ouaqui.

A referência às “bandeiras”0x00000112é o que é chamado decampo de bandeira. É binário e cada bit representa um recurso específico, um significa que o sinalizador está ativado ou definido e um zero significa que não está. Observe também que "0x..." significa que é um valor hexadecimal, portanto, se você convertê-lo de HEX para BIN:

0x00000112 = 0001 0001 0010 em binário.

Portanto, os sinalizadores que correspondem ao 2º, 5º e 9º bits no campo do sinalizador são definidos. Esses são os sinalizadores que estão sendo mostrados por nome na terceira linha de saída do objdumpcomando.

Significado das bandeiras

Os 3 sinalizadores que seu executável possui são bastante padronizados. Leia os bits da direita para a esquerda!

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

Então, as conclusões:

  • Este é um arquivo executável
  • inclui uma tabela de símbolos se você quiser depurá-la usando o Gnu Debugger, gdbpara que as funções tenham nomes significativos
  • o executável é vinculado dinamicamente às bibliotecas padrão, como glibc etc.

Endereço inicial

A última linha, endereço inicial ..., é como você adivinhou, onde o .CODE real começa para o executável.

informação relacionada