Estou tentando entender como as tabelas de símbolos se relacionam com a seção .data no ELF. Primeiro, algumas suposições que estou usando como base para começar.
Um símbolo é uma representação legível por humanos (ou "como escrito no arquivo de origem") de uma função ou variável que é mapeada para o valor binário real (no qual a CPU opera) disso.
Aqui está um exemplo
//simple.c
int var_global_init = 5;
int main(void)
{
return 0;
}
Vamos construí-lo e examinar o binário:
$ gcc simple.c -o simple
$ objdump -t simple | grep var_global_init
0000000000201010 g O .data 0000000000000004 var_global_init
Ele lista o símbolo na .data
seção do arquivo ELF. A página 20 da documentação ELF
define a .data
seção como:
Essas seções contêm dados inicializados que contribuem para a imagem da memória do programa.
Ok, isso meio que se encaixa. Então eu me pergunto Does this mean that the symbol table is
embedded in the .data section?
. Mas isso parece ser refutado pelo exemplo abaixo:
$ readelf -s simple
Symbol table '.symtab' contains 66 entries:
....
50: 0000000000201010 4 OBJECT GLOBAL DEFAULT 23 var_global_init
readelf
mostra que há uma .symtab
seção dedicada no ELF que contém o símbolo.
A .data
seção precisa da tabela de símbolos real. O primeiro exemplo aponta para a conclusão de que existe um na data
seção, mas não deveria ser capaz de executar apenas os valores binários?
Ao verificar hexdump
, consegui detectar apenas uma única entrada, então ou entendi errado os conceitos ou alguns deles estão mentindo. :)
A
.data
seção contém os próprios dados, ou seja , os quatro bytes que contêm oint
valor 5. A.symtab
seção contém os símbolos, ou seja , os nomes dados às várias partes do binário; ovar_global_init
nome do símbolo aponta para os quatro bytes de armazenamento na.data
seção.É por isso que você vê apenas uma entrada: há apenas um símbolo na tabela de símbolos. Mas você precisa de ambas as seções se quiser ir de um nome para um valor: a tabela de símbolos informa onde encontrar o valor correspondente ao
var_global_init
símbolo e a seção de dados contém o armazenamento do valor.