Partes do cabeçalho do arquivo

5

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

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

Eu tentei ler o cabeçalho do arquivo do executável final e obtive o resultado como este

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

Eu entendo a parte elf32-i386, mas não tenho certeza com as outras partes do cabeçalho.

é D_PAGED de alguma forma relacionado à demanda de paginação? e o que faz EXEC_P, HAS_SYSMS significa? é endereço inicial, o endereço lógico de main() do programa?

    
por ArunMKumar 03.05.2013 / 20:01

1 resposta

1

Os sinalizadores na saída são BFD - Descritores de Arquivos Binários . Eles são parte do pacote binutils, você pode ler o que os sinalizadores significam se você olhar no arquivo de cabeçalho do bfd /usr/include/bfd.h para seu significado ou aqui .

A referência aos "sinalizadores" 0x00000112 é o que é chamado de campo de sinalizador . É binário e cada bit representa uma característica específica, uma significa que a bandeira está ativada ou definida, e um zero significa que não é. Observe também que o "0x ..." significa que é um valor hexadecimal, portanto, se você convertê-lo de HEX para BIN:

0x00000112 = 0001 0001 0010 em binário.

Assim, os sinalizadores que correspondem aos 2º, 5º e 9º bits no campo sinalizador são definidos. Esses são os sinalizadores que estão sendo mostrados pelo nome na terceira linha de saída do comando objdump .

Significado das Bandeiras

Os 3 sinalizadores que o seu executável possui são bastante padrão. 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, o que é preciso?

  • este é um arquivo executável
  • inclui uma tabela de símbolos se você quiser depurá-la usando o Depurador do Gnu, gdb , para 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, start address ..., é como você adivinhou, onde o atual .CODE começa para o executável.

    
por 04.05.2013 / 10:52