¿Qué es una tabla de símbolos?

87

¿Alguien puede describir qué es una tabla de símbolos dentro del contexto de C y C ++?

jdt141
fuente

Respuestas:

81

Aquí hay dos significados comunes y relacionados de las tablas de símbolos.

Primero, está la tabla de símbolos en sus archivos de objeto. Por lo general, un compilador de C o C ++ compila un solo archivo de origen en un archivo de objeto con una extensión .obj o .o. Contiene una colección de código ejecutable y datos que el vinculador puede procesar en una aplicación de trabajo o biblioteca compartida. El archivo de objeto tiene una estructura de datos denominada tabla de símbolos que asigna los diferentes elementos del archivo de objeto a nombres que el vinculador puede entender. Si llama a una función desde su código, el compilador no pone la dirección final de la rutina en el archivo objeto. En su lugar, coloca un valor de marcador de posición en el código y agrega una nota que le dice al vinculador que busque la referencia en las diversas tablas de símbolos de todos los archivos de objeto que está procesando y pegue la ubicación final allí.

En segundo lugar, también está la tabla de símbolos en una biblioteca compartida o DLL. Esto lo produce el enlazador y sirve para nombrar todas las funciones y elementos de datos que son visibles para los usuarios de la biblioteca. Esto permite que el sistema realice enlaces en tiempo de ejecución, resolviendo las referencias abiertas a esos nombres a la ubicación donde la biblioteca está cargada en la memoria.

Si desea obtener más información, le sugiero el excelente libro de John Levine "Linkers and Loaders". Texto del enlace

Ben Combee
fuente
Hola Ben, en el segundo caso, ¿te refieres a la tabla de exportación? Es decir, ¿la tabla de exportación es un caso especial de la tabla de símbolos? ¿O son estos conceptos no relacionados?
Pooven
Hola. Creo que no está en ningún archivo de objeto, sino que se refiere a ellos. En segundo lugar, ¿podría explicar un poco más lo que quiso decir con "ubicación final"? Dirección física o dirección relativa finalizada en el código fuente.
stdout
26

Brevemente, es la asignación del nombre que le asigna a una variable a su dirección en la memoria, incluidos los metadatos como el tipo, el alcance y el tamaño. Es utilizado por el compilador.

Eso es en general, no solo C [++] *. Técnicamente, no siempre incluye la dirección de memoria directa. Depende del idioma, la plataforma, etc. al que se dirige el compilador.

Steve Landey
fuente
Creo que fue muy importante que mencionaras el contenido de la dirección diciendo "no siempre incluye la dirección de memoria directa".
stdout
13

En Linux, puede usar el comando:

nm [archivo de objeto]

para enumerar la tabla de símbolos de ese archivo de objeto. A partir de esta impresión, puede descifrar los símbolos del enlazador en uso de sus nombres destrozados .

ZeHolyQofPower
fuente
8

La tabla de símbolos es la lista de "símbolos" en un programa / unidad. Los símbolos suelen ser nombres de variables o funciones. La tabla de símbolos se puede utilizar para determinar en qué parte de la memoria se ubicarán las variables o funciones.

Joe Schneider
fuente
0

La tabla de símbolos es una estructura de datos importante creada y mantenida por los compiladores para almacenar información sobre la aparición de varias entidades, como nombres de variables, nombres de funciones, objetos, clases, interfaces, etc.

rashedcs
fuente
Los enlazadores y ensambladores también tratan con tablas de símbolos (a menudo más simples que las del compilador).
Basile Starynkevitch