Symbol tabel

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

Implementering

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.

Ansøgning

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.

Eksempel

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 eksempel
Adresse 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

Se også

Noter

  1. Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman. Ch. 2: Montering og lancering af moduler; Kernelsymboltabel // Linux-enhedsdrivere, tredje udgave . - O'Reilly Media, 2005. - ISBN 0-596-00590-3 . Arkiveret 28. marts 2014 på Wayback Machine