Apa itu tabel simbol?

87

Adakah yang bisa menjelaskan apa itu tabel simbol dalam konteks C dan C ++?

jdt141
sumber

Jawaban:

81

Ada dua arti umum dan terkait dari tabel simbol di sini.

Pertama, ada tabel simbol di file objek Anda. Biasanya, compiler C atau C ++ mengompilasi satu file sumber menjadi file objek dengan ekstensi .obj atau .o. Ini berisi kumpulan kode dan data yang dapat dieksekusi yang dapat diproses linker menjadi aplikasi yang berfungsi atau pustaka bersama. File objek memiliki struktur data yang disebut tabel simbol di dalamnya yang memetakan item berbeda dalam file objek ke nama yang dapat dipahami oleh linker. Jika Anda memanggil fungsi dari kode Anda, kompilator tidak meletakkan alamat akhir rutinitas tersebut di file objek. Sebaliknya, ini menempatkan nilai placeholder ke dalam kode dan menambahkan catatan yang memberi tahu linker untuk mencari referensi di berbagai tabel simbol dari semua file objek yang diprosesnya dan menempelkan lokasi terakhir di sana.

Kedua, ada juga tabel simbol di pustaka bersama atau DLL. Ini dihasilkan oleh linker dan berfungsi untuk memberi nama semua fungsi dan item data yang dapat dilihat oleh pengguna perpustakaan. Hal ini memungkinkan sistem untuk melakukan penautan waktu proses, menyelesaikan referensi terbuka ke nama-nama tersebut ke lokasi tempat pustaka dimuat dalam memori.

Jika Anda ingin mempelajari lebih lanjut, saya sarankan buku John Levine yang sangat bagus "Linkers and Loaders". teks tautan

Ben Combee
sumber
Hai Ben, pada kasus kedua, apakah Anda mengacu pada tabel ekspor? Yaitu, apakah tabel ekspor merupakan kasus khusus dari tabel simbol? Atau apakah konsep ini tidak berhubungan?
Pooven
Hai. Saya yakin itu tidak ada dalam file objek apa pun tetapi dirujuk dari mereka. Kedua, dapatkah Anda menjelaskan lebih banyak lagi apa yang Anda maksud dengan "lokasi akhir"? Alamat fisik atau alamat relatif akhir dalam kode sumber.
stdout
26

Singkatnya, ini adalah pemetaan nama yang Anda tetapkan variabel ke alamatnya di memori, termasuk metadata seperti jenis, cakupan, dan ukuran. Ini digunakan oleh kompiler.

Itu secara umum, bukan hanya C [++] *. Secara teknis, itu tidak selalu menyertakan alamat memori langsung. Itu tergantung pada bahasa apa, platform, dll. Yang ditargetkan kompilator.

Steve Landey
sumber
Menurut saya, sangatlah penting bagi Anda untuk menyebutkan isi alamat dengan mengatakan "tidak selalu menyertakan alamat memori langsung".
stdout
13

Di Linux, Anda dapat menggunakan perintah:

nm [file objek]

untuk membuat daftar tabel simbol dari file objek itu. Dari hasil cetak ini, Anda kemudian dapat menguraikan simbol linker yang sedang digunakan dari namanya yang rusak .

ZeHolyQofPower
sumber
8

Tabel simbol adalah daftar "simbol" dalam program / unit. Simbol paling sering merupakan nama variabel atau fungsi. Tabel simbol dapat digunakan untuk menentukan di mana letak variabel atau fungsi memori.

Joe Schneider
sumber
0

Tabel simbol adalah struktur data penting yang dibuat dan dipelihara oleh penyusun untuk menyimpan informasi tentang terjadinya berbagai entitas seperti nama variabel, nama fungsi, objek, kelas, antarmuka, dll.

ruam
sumber
Linker dan assembler juga menangani tabel simbol (seringkali lebih sederhana daripada tabel kompilator).
Basile Starynkevitch