O que é uma tabela de símbolos?

88

Alguém pode descrever o que é uma tabela de símbolos no contexto de C e C ++?

jdt141
fonte

Respostas:

82

Existem dois significados comuns e relacionados de tabelas de símbolos aqui.

Primeiro, há a tabela de símbolos em seus arquivos de objeto. Normalmente, um compilador C ou C ++ compila um único arquivo de origem em um arquivo de objeto com uma extensão .obj ou .o. Ele contém uma coleção de código executável e dados que o vinculador pode processar em um aplicativo de trabalho ou biblioteca compartilhada. O arquivo de objeto possui uma estrutura de dados chamada tabela de símbolos que mapeia os diferentes itens no arquivo de objeto para nomes que o vinculador pode entender. Se você chamar uma função do seu código, o compilador não colocará o endereço final da rotina no arquivo-objeto. Em vez disso, ele coloca um valor de espaço reservado no código e adiciona uma nota que diz ao vinculador para procurar a referência nas várias tabelas de símbolos de todos os arquivos de objeto que está processando e colocar o local final lá.

Em segundo lugar, há também a tabela de símbolos em uma biblioteca compartilhada ou DLL. Isso é produzido pelo vinculador e serve para nomear todas as funções e itens de dados que são visíveis aos usuários da biblioteca. Isso permite que o sistema faça a vinculação em tempo de execução, resolvendo referências abertas a esses nomes para o local onde a biblioteca está carregada na memória.

Se você quiser aprender mais, sugiro o excelente livro de John Levine "Linkers and Loaders". Texto do link

Ben Combee
fonte
Olá Ben, no segundo caso, você está se referindo à tabela de exportação? Ou seja, a tabela de exportação é um caso especial da tabela de símbolos? Ou são conceitos não relacionados?
Pooven,
Oi. Eu acredito que não está em nenhum arquivo de objeto, mas se refere a eles. Em segundo lugar, você poderia explicar um pouco mais o que você quis dizer com "localização final"? Endereço físico ou endereço relativo finalizado no código-fonte.
stdout
O segundo que você menciona é uma referência ao ramo ou mesa de chamadas?
Nikos
26

Resumidamente, é o mapeamento do nome que você atribui a uma variável ao seu endereço na memória, incluindo metadados como tipo, escopo e tamanho. É usado pelo compilador.

Em geral, não apenas C [++] *. Tecnicamente, nem sempre inclui o endereço de memória direto. Depende de qual idioma, plataforma, etc. o compilador está almejando.

Steve Landey
fonte
Acho que foi muito importante você mencionar o conteúdo do endereço dizendo "nem sempre inclui o endereço de memória direto".
stdout
13

No Linux, você pode usar o comando:

nm [arquivo objeto]

para listar a tabela de símbolos desse arquivo de objeto. A partir desta impressão, você pode decifrar os símbolos do linker em uso a partir de seus nomes mutilados .

ZeHolyQofPower
fonte
8

A tabela de símbolos é a lista de "símbolos" em um programa / unidade. Os símbolos são geralmente nomes de variáveis ​​ou funções. A tabela de símbolos pode ser usada para determinar onde as variáveis ​​ou funções da memória serão localizadas.

Joe Schneider
fonte
0

A tabela de símbolos é uma estrutura de dados importante criada e mantida por compiladores para armazenar informações sobre a ocorrência de várias entidades, como nomes de variáveis, nomes de funções, objetos, classes, interfaces, etc.

erupções cutâneas
fonte
Linkers e assemblers também lidam com tabelas de símbolos (geralmente mais simples do que as do compilador).
Basile Starynkevitch 01 de