Estou tentando entender como as tabelas de símbolos
relacionar-se com a seção .data no ELF. Primeiro alguns
suposições que estou usando como base para começar.
A symbol is a human readable (or "as written in the source file")
representation of a function or a variable that is mapped to the
actual binary value (that the CPU operates on) of that.
Aqui está um exemplo
//simple.c
int var_global_init = 5;
int main(void)
{
return 0;
}
Vamos criar 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 seção .data
do arquivo ELF.
Página 20 da documentação da ELF
define a seção .data
como:
These sections hold initialized data that contribute to the program's memory image.
Ok, esse tipo de ajuste. Então eu me pergunto Does this mean that the symbol table is
embedded in the .data section?
. Mas isso parece ser desmentido 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 seção .symtab
dedicada no ELF que contém
o símbolo.
A seção .data
precisa da tabela de símbolos real. O primeiro exemplo
aponta para concluir que existe um na seção data
, mas ele não deve ser capaz de executar apenas os valores binários?
Ao verificar hexdump
, consegui detectar apenas uma única entrada, por isso, fiquei com os conceitos errados ou alguns deles estão mentindo. :)