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