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_PAGED
de alguma forma relacionado à paginação por demanda? e o que
EXEC_P, HAS_SYSMS
significa? é 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.h
seu 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 objdump
comando.
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,
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, endereço inicial ..., é como você adivinhou, onde o .CODE real começa para o executável.