Apa itu tabel simbol?


87

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

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


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.


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 .


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.



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.


Linker dan assembler juga menangani tabel simbol (seringkali lebih sederhana daripada tabel kompilator).
Basile Starynkevitch
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.