Cos'è una tabella dei simboli?


87

Qualcuno può descrivere cos'è una tabella dei simboli nel contesto di C e C ++?

Risposte:


81

Ci sono due significati comuni e correlati delle tabelle dei simboli qui.

Innanzitutto, c'è la tabella dei simboli nei file oggetto. Di solito, un compilatore C o C ++ compila un singolo file sorgente in un file oggetto con estensione .obj o .o. Contiene una raccolta di codice eseguibile e dati che il linker può elaborare in un'applicazione funzionante o una libreria condivisa. Il file oggetto ha una struttura di dati chiamata tabella dei simboli che associa i diversi elementi nel file oggetto a nomi comprensibili dal linker. Se chiami una funzione dal tuo codice, il compilatore non inserisce l'indirizzo finale della routine nel file oggetto. Invece, inserisce un valore segnaposto nel codice e aggiunge una nota che dice al linker di cercare il riferimento nelle varie tabelle di simboli da tutti i file oggetto che sta elaborando e di attaccare la posizione finale lì.

In secondo luogo, c'è anche la tabella dei simboli in una libreria condivisa o DLL. Questo è prodotto dal linker e serve a nominare tutte le funzioni e gli elementi di dati che sono visibili agli utenti della libreria. Ciò consente al sistema di eseguire il collegamento in fase di esecuzione, risolvendo i riferimenti aperti a quei nomi nella posizione in cui la libreria è caricata in memoria.

Se vuoi saperne di più, ti consiglio l'eccellente libro di John Levine "Linkers and Loaders". testo del collegamento


Ciao Ben, nel secondo caso ti riferisci alla tabella delle esportazioni? Cioè, la tabella di esportazione è un caso speciale della tabella dei simboli? O sono questi concetti non correlati?
Pooven

Ciao. Credo che non sia in alcun file oggetto ma indicato da loro. In secondo luogo, potresti spiegare un po 'di più cosa intendi per "posizione finale"? Indirizzo fisico o indirizzo relativo finalizzato nel codice sorgente.
stdout

26

In breve, è la mappatura del nome che assegni a una variabile al suo indirizzo in memoria, inclusi metadati come tipo, ambito e dimensione. Viene utilizzato dal compilatore.

Questo è in generale, non solo C [++] *. Tecnicamente, non include sempre l'indirizzo di memoria diretto. Dipende dalla lingua, dalla piattaforma, ecc. Il compilatore sta prendendo di mira.


Penso che sia stato molto importante che tu menzionassi il contenuto dell'indirizzo dicendo "non sempre include l'indirizzo di memoria diretto".
stdout

13

In Linux, puoi usare il comando:

nm [file oggetto]

per elencare la tabella dei simboli di quel file oggetto. Da questa stampa, puoi quindi decifrare i simboli del linker in uso dai loro nomi alterati .


8

La tabella dei simboli è l'elenco dei "simboli" in un programma / unità. I simboli sono spesso i nomi di variabili o funzioni. La tabella dei simboli può essere utilizzata per determinare dove verranno collocate le variabili o le funzioni nella memoria.



0

La tabella dei simboli è un'importante struttura di dati creata e mantenuta dai compilatori al fine di memorizzare le informazioni sull'occorrenza di varie entità come nomi di variabili, nomi di funzioni, oggetti, classi, interfacce, ecc.


I linker e gli assemblatori si occupano anche delle tabelle dei simboli (spesso più semplici di quelle del compilatore).
Basile Starynkevitch
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.