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 ++?

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


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.


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 .


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.



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.


Linkers e assemblers também lidam com tabelas de símbolos (geralmente mais simples do que as do compilador).
Basile Starynkevitch 01 de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.