Symboltabell

Inom datavetenskap är en symboltabell (från den engelska  symboltabellen "table of identifiers") en datastruktur som används av en översättare ( kompilator eller tolk ), där varje variabel eller funktionsidentifierare från källkoden är associerad med information relaterad till dess deklaration eller utseende i koden: datatyp , omfattning och i vissa fall minnesplats ( offset ).

Implementering

En vanlig implementering är hashtabellen . Kompilatorn kan antingen använda en enda tabell för symboler, eller separera symboler i flera hierarkiska tabeller enligt olika omfattningar . Det finns även implementeringar i form av träd, linjära och självorganiserande listor.

Applikation

Objektmodulen (eng. objektfil) innehåller en symboltabell för externt synliga (offentliga) identifierare. När du länkar ( länkar ) olika objektmoduler använder länken symboltabeller för att lösa referenser mellan moduler.

Symboltabellen kanske bara existerar under översättningens varaktighet, men ibland är den inbäddad i utdata från den processen för senare användning, till exempel under interaktiv felsökning eller som en källa för att formatera en diagnostisk rapport under eller efter programkörning.

Under reverse engineering använder många verktyg en tabell för att kontrollera vilka adresser som tillhör globala variabler och kända funktioner. Om symboltabellen togs bort från objektmodulerna innan länkning (till exempel med remsa från GNU binutils ), kommer det att vara svårare för verktyg att fastställa adresserna till viktiga platser i programmet och analysera det.

Vid åtkomst till variabler och dynamisk allokering av minne måste kompilatorn göra mycket arbete, därför kräver den utökade stackmodellen med dynamisk allokering en symboltabell.[ klara upp ]

Ett bra exempel på användningen av symboltabellen kan fungera som modulära kärnor i Unix-familjen : symboltabellen kan användas av laddningsbara kärnmoduler (till exempel drivrutiner) för att komma åt vissa tecken. Detta är dock inte nödvändigt om modulen inte kommer åt kärnan, inte använder interna funktioner, variabler etc. [1] Det är möjligt att klara sig utan symboltabellen och komma åt minnet inuti kärnan direkt, men i detta fall portabiliteten av moduler kommer att gå förlorad, eftersom med olika kärnkonfigurationer kommer samma kod att placeras på olika platser.

Exempel

Nedan finns en symboltabell för ett litet program. För att skapa det användes nm - verktyget från GNU binutils-paketet . Tabellen har en datasymbol markerad (markerad som typ "D") och många funktioner (både från standardbiblioteket och tillhörande själva programmet). Den första kolumnen innehåller adressen till förskjutningen i minnet, den andra kolumnen innehåller symboltypen och den tredje kolumnen innehåller dess namn.

Tabellexempel
Adress Sorts namn
00000020 a T_BIT
00000040 a F_BIT
00000080 a JAG BET
20000004 t irqvec
20000008 t fiqvec
2000000c t InitReset
20000018 T _main
20000024 t slutet
20000030 T AT91F_US3_CfgPIO_useB
2000005c t AT91F_PIO_CfgPeriph
200 000b0 T huvud
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_Konfigurera
200003dc t AT91F_US_SetBaudrate
2000041c t AT91F_US_Baudrate
200004ec t AT91F_US_SetTimeguard
2000051c t AT91F_PDC_Öppen
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 _data
200009a0 A _etext
200009a0 D holaamigosh
200009a4 A __bss_end__
200009a4 A __bss_start
200009a4 A __bss_start__
200009a4 A _edata
200009a4 A _slutet

Se även

Anteckningar

  1. Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman. Ch. 2: Montering och lansering av moduler; Kärnsymboltabell // Linux-enhetsdrivrutiner, tredje upplagan . - O'Reilly Media, 2005. - ISBN 0-596-00590-3 . Arkiverad 28 mars 2014 på Wayback Machine