En informática , una tabla de símbolos (del inglés symbol table "tabla de identificadores") es una estructura de datos utilizada por un traductor ( compilador o intérprete ), en la que cada identificador de variable o función del código fuente está asociado con información relacionada con su declaración o aparición en el código: tipo de datos , alcance y, en algunos casos , ubicación de memoria ( desplazamiento ).
Una implementación comúnmente utilizada es la tabla hash . El compilador puede usar una sola tabla para los símbolos o separar los símbolos en varias tablas jerárquicas de acuerdo con diferentes ámbitos . También hay implementaciones en forma de árboles, listas lineales y autoorganizadas.
El módulo de objeto (ing. archivo de objeto) contiene una tabla de símbolos para identificadores (públicos) visibles externamente. Al vincular ( vincular ) diferentes módulos de objetos , el vinculador utiliza tablas de símbolos para resolver las referencias entre módulos.
Es posible que la tabla de símbolos solo exista mientras dure la traducción, pero a veces está incrustada en la salida de ese proceso para su uso posterior, como durante la depuración interactiva o como fuente para formatear un informe de diagnóstico durante o después de la ejecución del programa.
Durante la ingeniería inversa, muchas utilidades usan una tabla para verificar qué direcciones pertenecen a variables globales y funciones conocidas. Si la tabla de símbolos se eliminó de los módulos de objetos antes del enlace (por ejemplo, con strip de GNU binutils ), será más difícil para las utilidades determinar las direcciones de lugares importantes en el programa y analizarlas.
Al acceder a las variables y asignar memoria dinámicamente, el compilador tiene que hacer mucho trabajo, por lo tanto, el modelo de pila extendida con asignación dinámica requiere una tabla de símbolos.[ aclarar ]
Un buen ejemplo del uso de la tabla de símbolos puede servir como kernels modulares de la familia Unix : la tabla de símbolos puede ser utilizada por módulos del kernel cargables (por ejemplo, controladores) para acceder a ciertos caracteres. Sin embargo, esto no es necesario si el módulo no accede al kernel, no usa funciones internas, variables, etc. [1] Es posible prescindir de la tabla de símbolos y acceder directamente a la memoria dentro del kernel, pero en este caso se perderá la portabilidad de los módulos, ya que con diferentes configuraciones del kernel, el mismo código se colocará en diferentes lugares.
A continuación se muestra una tabla de símbolos para un pequeño programa. Para crearlo se utilizó la utilidad nm del paquete binutils de GNU . La tabla tiene un símbolo de datos marcado (marcado como tipo "D") y muchas funciones (tanto de la biblioteca estándar como pertenecientes al propio programa). La primera columna contiene la dirección del desplazamiento en la memoria, la segunda columna contiene el tipo de símbolo y la tercera columna contiene su nombre.
Dirección | Tipo de | Nombre |
---|---|---|
00000020 | a | T_BIT |
00000040 | a | F_BIT |
00000080 | a | I_BIT |
20000004 | t | irqvec |
20000008 | t | fiqvec |
2000000c | t | InitReset |
20000018 | T | _principal |
20000024 | t | Final |
20000030 | T | AT91F_US3_CfgPIO_useB |
2000005c | t | AT91F_PIO_CfgPeriph |
200000b0 | T | principal |
20000120 | T | AT91F_DBGU_Printk |
20000190 | t | AT91F_US_TxListo |
200001c0 | t | AT91F_US_PutChar |
200001f8 | T | AT91F_SpuriousHandler |
20000214 | T | AT91F_DataAbort |
20000230 | T | AT91F_FetchAbort |
2000024c | T | AT91F_Undef |
20000268 | T | AT91F_UndefHandler |
20000284 | T | AT91F_LowLevelInit |
200002e0 | t | AT91F_DBGU_CfgPIO |
2000030c | t | AT91F_PIO_CfgPeriph |
20000360 | t | AT91F_US_Configurar |
200003cc | t | AT91F_US_SetBaudrate |
2000041c | t | AT91F_US_Velocidad de baudios |
200004ec | t | AT91F_US_SetTimeguard |
2000051c | t | AT91F_PDC_Abierto |
2000059c | t | AT91F_PDC_DisableRx |
200005c8 | t | AT91F_PDC_DisableTx |
200005f4 | t | AT91F_PDC_SetNextTx |
20000638 | t | AT91F_PDC_SetNextRx |
2000067c | t | AT91F_PDC_SetTx |
200006c0 | t | AT91F_PDC_SetRx |
20000704 | t | AT91F_PDC_EnableRx |
20000730 | t | AT91F_PDC_EnableTx |
2000075c | t | AT91F_US_EnableTx |
20000788 | T | __aeabi_uidiv |
20000788 | T | __udivsi3 |
20000884 | T | __aeabi_uidivmod |
2000089c | T | __aeabi_idiv0 |
2000089c | T | __aeabi_ldiv0 |
2000089c | T | __div0 |
200009a0 | D | _datos |
200009a0 | A | _etext |
200009a0 | D | holaamigosh |
200009a4 | A | __bss_end__ |
200009a4 | A | __bss_start |
200009a4 | A | __bss_start__ |
200009a4 | A | _edata |
200009a4 | A | _final |