Az informatikában a szimbólumtábla (az angol szimbólumtáblázatból "table of identifiers") egy fordító ( fordító vagy értelmező ) által használt adatstruktúra , amelyben a forráskódból származó minden változó vagy függvényazonosító hozzá van rendelve az adott változóhoz kapcsolódó információhoz. deklaráció vagy megjelenés a kódban : adattípus , hatókör és bizonyos esetekben a memória helye ( offset ).
Egy gyakran használt megvalósítás a hash tábla . A fordító használhat egyetlen táblázatot a szimbólumokhoz, vagy különítheti el a szimbólumokat több hierarchikus táblázatba a különböző hatóköröknek megfelelően . Vannak megvalósítások fák, lineáris és önszerveződő listák formájában is.
Az objektummodul (eng. object file) tartalmaz egy szimbólumtáblázatot a külsőleg látható (nyilvános) azonosítókhoz. Különböző objektummodulok összekapcsolásakor ( linkelésekor ) a linker szimbólumtáblázatokat használ a modulok közötti hivatkozások feloldására.
A szimbólumtábla csak a fordítás idejére létezhet, de néha beágyazódik a folyamat kimenetébe későbbi felhasználás céljából, például az interaktív hibakeresés során , vagy forrásként szolgál a diagnosztikai jelentés formázásához a program végrehajtása közben vagy után.
A visszafejtés során sok segédprogram táblázatot használ annak ellenőrzésére, hogy mely címek tartoznak a globális változókhoz és az ismert függvényekhez. Ha a szimbólumtáblázatot eltávolítottuk az objektummodulokból a linkelés előtt (például a GNU binutils csíkjával ), akkor a segédprogramok nehezebben tudják meghatározni a program fontos helyeinek címét és elemezni azt.
A változókhoz való hozzáférés és a memória dinamikus lefoglalása során a fordítónak sok munkát kell végeznie, ezért a dinamikus allokációval rendelkező bővített veremmodellhez szimbólumtáblázatra van szükség.[ tiszta ]
A szimbólumtábla használatának jó példája a Unix család moduláris kerneljeként szolgálhat : a szimbólumtáblázatot betölthető kernelmodulok (például illesztőprogramok) használhatják bizonyos karakterek eléréséhez. Ez azonban nem szükséges, ha a modul nem éri el a kernelt, nem használ belső függvényeket, változókat stb. [1] Lehetséges a szimbólumtábla nélkül is, és közvetlenül hozzáférni a kernelen belüli memóriához, de ebben az esetben a modulok hordozhatósága elvész, mivel különböző kernelkonfigurációk esetén ugyanaz a kód különböző helyekre kerül.
Az alábbiakban egy kis program szimbólumtáblázata található. Létrehozásához a GNU binutils csomag nm segédprogramját használták . A táblában egy adatszimbólum van megjelölve ("D" típusúként) és sok funkció (mind a standard könyvtárból, mind pedig magához a programhoz tartozik). Az első oszlop a memóriában lévő eltolás címét tartalmazza, a második oszlop a szimbólumtípust , a harmadik oszlop pedig a nevét.
Cím | Típusú | Név |
---|---|---|
00000020 | a | T_BIT |
00000040 | a | F_BIT |
00000080 | a | HARAPTAM |
20000004 | t | irqvec |
20000008 | t | fiqvec |
2000000 c | t | InitReset |
20000018 | T | _fő |
20000024 | t | vége |
20000030 | T | AT91F_US3_CfgPIO_useB |
2000005c | t | AT91F_PIO_CfgPeriph |
200000b0 | T | fő- |
20000120 | T | AT91F_DBGU_Printk |
20000190 | t | AT91F_US_TxReady |
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_Configure |
200003dc | t | AT91F_US_SetBaudrate |
2000041c | t | AT91F_US_Baudrate |
200004ec | t | AT91F_US_SetTimeguard |
2000051c | t | AT91F_PDC_Open |
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 | _adat |
200009a0 | A | _etext |
200009a0 | D | holaamigosh |
200009a4 | A | __bss_end__ |
200009a4 | A | __bss_start |
200009a4 | A | __bss_start__ |
200009a4 | A | _edata |
200009a4 | A | _end |