Tabla de símbolos

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

Implementación

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.

Aplicación

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.

Ejemplo

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.

Ejemplo de tabla
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

Véase también

Notas

  1. Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman. cap. 2: Montaje y lanzamiento de módulos; Tabla de símbolos del núcleo // Controladores de dispositivos Linux, tercera edición . - O'Reilly Media, 2005. - ISBN 0-596-00590-3 . Archivado el 28 de marzo de 2014 en Wayback Machine .