Tabela de símbolos na seção .data do ELF

0

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. :)

    
por TheMeaningfulEngineer 26.03.2018 / 00:44

1 resposta

3

A seção .data contém os dados em si, ie os quatro bytes que contêm o valor int 5. A seção .symtab contém os símbolos, ie os nomes dados a várias partes do binário; o nome do símbolo var_global_init aponta para os quatro bytes de armazenamento na seção .data .

É por isso que você vê apenas uma entrada: há apenas um símbolo na tabela de símbolos. Mas você precisa das duas seções se quiser ir de um nome a um valor: a tabela de símbolos informa onde encontrar o valor correspondente ao símbolo var_global_init , e a seção de dados contém o armazenamento para o valor.

    
por 26.03.2018 / 00:56