Co to jest tablica symboli?

87

Czy ktoś może opisać, czym jest tablica symboli w kontekście C i C ++?

jdt141
źródło

Odpowiedzi:

81

Istnieją tutaj dwa wspólne i powiązane znaczenia tablic symboli.

Po pierwsze, w twoich plikach obiektowych znajduje się tablica symboli. Zwykle kompilator C lub C ++ kompiluje pojedynczy plik źródłowy do pliku obiektowego z rozszerzeniem .obj lub .o. Zawiera zbiór wykonywalnego kodu i danych, które konsolidator może przetworzyć w działającą aplikację lub bibliotekę współdzieloną. Plik obiektowy ma strukturę danych zwaną tabelą symboli, która odwzorowuje różne elementy w pliku obiektowym na nazwy zrozumiałe dla konsolidatora. Jeśli wywołasz funkcję z kodu, kompilator nie umieści końcowego adresu procedury w pliku obiektowym. Zamiast tego umieszcza wartość zastępczą w kodzie i dodaje notatkę, która mówi konsolidatorowi, aby wyszukał odwołanie w różnych tabelach symboli ze wszystkich przetwarzanych plików obiektowych i umieścił tam ostateczną lokalizację.

Po drugie, istnieje również tabela symboli w bibliotece współdzielonej lub DLL. Jest to tworzone przez linker i służy do nazwania wszystkich funkcji i elementów danych, które są widoczne dla użytkowników biblioteki. Pozwala to systemowi na łączenie w czasie wykonywania, rozpoznawanie otwartych odwołań do tych nazw do lokalizacji, w której biblioteka jest ładowana do pamięci.

Jeśli chcesz dowiedzieć się więcej, proponuję doskonałą książkę Johna Levine'a „Łączniki i ładowarki”. tekst linku

Ben Combee
źródło
Cześć Ben, czy w drugim przypadku masz na myśli tabelę eksportu? To znaczy, czy tablica eksportu jest specjalnym przypadkiem tablicy symboli? A może są to niepowiązane koncepcje?
Pooven
Cześć. Wydaje mi się, że nie ma go w żadnym pliku obiektowym, ale został z nich odesłany. Po drugie, czy mógłbyś wyjaśnić nieco więcej, co masz na myśli mówiąc o „ostatecznej lokalizacji”? Adres fizyczny lub ostateczny adres względny w kodzie źródłowym.
wyjście
26

Krótko mówiąc, jest to mapowanie nazwy, którą przypisujesz zmiennej do jej adresu w pamięci, w tym metadane, takie jak typ, zakres i rozmiar. Jest używany przez kompilator.

To generalnie, nie tylko C [++] *. Technicznie nie zawsze zawiera bezpośredni adres pamięci. Zależy to od języka, platformy itp., Na który jest przeznaczony kompilator.

Steve Landey
źródło
Myślę, że bardzo ważne było, aby wspomnieć o treści adresu, mówiąc „nie zawsze zawiera adres bezpośredni”.
wyjście
13

W Linuksie możesz użyć polecenia:

nm [plik obiektu]

aby wyświetlić tablicę symboli tego pliku obiektowego. Z tego wydruku można następnie rozszyfrować używane symbole łącznika z ich zniekształconych nazw .

ZeHolyQofPower
źródło
8

Tablica symboli to lista „symboli” w programie / jednostce. Symbole to najczęściej nazwy zmiennych lub funkcji. Tablica symboli może służyć do określenia, gdzie w pamięci zostaną umieszczone zmienne lub funkcje.

Joe Schneider
źródło
0

Tablica symboli to ważna struktura danych tworzona i utrzymywana przez kompilatory w celu przechowywania informacji o występowaniu różnych encji, takich jak nazwy zmiennych, nazwy funkcji, obiekty, klasy, interfejsy itp.

zrazy
źródło
Konsolidatory i asemblery również radzą sobie z tablicami symboli (często prostszymi niż kompilatory).
Basile Starynkevitch