Inden for datalogi er en symboltabel (fra den engelske symbol tabel "table of identifiers") en datastruktur, der bruges af en oversætter ( kompiler eller fortolker ), hvor hver variabel eller funktionsidentifikator fra kildekoden er forbundet med information relateret til dens erklæring eller udseende i koden: datatype , omfang og i nogle tilfælde hukommelsesplacering ( offset ).
En almindeligt anvendt implementering er hash-tabellen . Compileren kan enten bruge en enkelt tabel til symboler eller adskille symboler i flere hierarkiske tabeller i henhold til forskellige omfang . Der er også implementeringer i form af træer, lineære og selvorganiserende lister.
Objektmodulet (eng. objektfil) indeholder en symboltabel for eksternt synlige (offentlige) identifikatorer. Når der sammenkædes ( linker ) forskellige objektmoduler , bruger linkeren symboltabeller til at løse referencer mellem moduler.
Symboltabellen eksisterer muligvis kun under oversættelsens varighed, men nogle gange er den indlejret i outputtet af denne proces til senere brug, såsom under interaktiv debugging eller som en kilde til formatering af en diagnostisk rapport under eller efter programafvikling.
Under reverse engineering bruger mange hjælpeprogrammer en tabel til at kontrollere, hvilke adresser der hører til globale variabler og kendte funktioner. Hvis symboltabellen blev fjernet fra objektmodulerne før linkning (for eksempel med strip fra GNU binutils ), vil det være vanskeligere for hjælpeprogrammer at bestemme adresserne på vigtige steder i programmet og analysere det.
Når du får adgang til variabler og dynamisk allokering af hukommelse, skal compileren gøre en masse arbejde, derfor kræver den udvidede stakmodel med dynamisk allokering en symboltabel.[ ryd op ]
Et godt eksempel på brugen af symboltabellen kan tjene som modulære kerner i Unix-familien : Symboltabellen kan bruges af indlæsbare kernemoduler (f.eks. drivere) til at få adgang til bestemte tegn. Dette er dog ikke nødvendigt, hvis modulet ikke får adgang til kernen, ikke bruger interne funktioner, variabler osv. [1] Det er muligt at undvære symboltabellen og tilgå hukommelsen inde i kernen direkte, men i dette tilfælde portabiliteten af moduler vil gå tabt, da med forskellige kernekonfigurationer vil den samme kode blive placeret forskellige steder.
Nedenfor er en symboltabel for et lille program. For at oprette det blev nm -værktøjet fra GNU binutils-pakken brugt . Tabellen har ét datasymbol markeret (markeret som type "D") og mange funktioner (både fra standardbiblioteket og tilhørende selve programmet). Den første kolonne indeholder adressen på forskydningen i hukommelsen, den anden kolonne indeholder symboltypen , og den tredje kolonne indeholder dens navn.
Tabel eksempelAdresse | Type | Navn |
---|---|---|
00000020 | -en | T_BIT |
00000040 | -en | F_BIT |
00000080 | -en | I_BIT |
20000004 | t | irqvec |
20000008 | t | fiqvec |
2000000c | t | InitReset |
20000018 | T | _hoved |
20000024 | t | ende |
20000030 | T | AT91F_US3_CfgPIO_useB |
2000005c | t | AT91F_PIO_CfgPeriph |
200000b0 | T | vigtigste |
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_Konfigurer |
200003dc | t | AT91F_US_SetBaudrate |
2000041c | t | AT91F_US_Baudrate |
200004ec | t | AT91F_US_SetTimeguard |
2000051c | t | AT91F_PDC_Åben |
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 | EN | _etekst |
200009a0 | D | holaamigosh |
200009a4 | EN | __bss_end__ |
200009a4 | EN | __bss_start |
200009a4 | EN | __bss_start__ |
200009a4 | EN | _edata |
200009a4 | EN | _ende |