ตารางสัญลักษณ์คืออะไร?


87

ใครสามารถอธิบายตารางสัญลักษณ์ภายในบริบทของ C และ C ++ ได้หรือไม่?

คำตอบ:


81

มีสองความหมายทั่วไปและเกี่ยวข้องกันของตารางสัญลักษณ์ที่นี่

ขั้นแรกมีตารางสัญลักษณ์ในไฟล์วัตถุของคุณ โดยปกติคอมไพเลอร์ C หรือ C ++ จะรวบรวมไฟล์ต้นฉบับเดียวลงในไฟล์อ็อบเจ็กต์ที่มีนามสกุล. obj หรือ. o สิ่งนี้ประกอบด้วยชุดของรหัสปฏิบัติการและข้อมูลที่ตัวเชื่อมโยงสามารถประมวลผลลงในแอปพลิเคชันที่ใช้งานได้หรือไลบรารีที่ใช้ร่วมกัน อ็อบเจ็กต์ไฟล์มีโครงสร้างข้อมูลที่เรียกว่าตารางสัญลักษณ์ซึ่งแม็พไอเท็มต่างๆในอ็อบเจ็กต์ไฟล์กับชื่อที่ผู้เชื่อมโยงสามารถเข้าใจได้ หากคุณเรียกใช้ฟังก์ชันจากโค้ดของคุณคอมไพลเลอร์จะไม่ใส่ที่อยู่สุดท้ายของรูทีนในอ็อบเจ็กต์ไฟล์ แต่จะใส่ค่าตัวยึดตำแหน่งลงในโค้ดและเพิ่มโน้ตที่บอกให้ผู้เชื่อมโยงค้นหาข้อมูลอ้างอิงในตารางสัญลักษณ์ต่างๆจากไฟล์ออบเจ็กต์ทั้งหมดที่กำลังประมวลผลและติดตำแหน่งสุดท้ายไว้ที่นั่น

ประการที่สองยังมีตารางสัญลักษณ์ในไลบรารีที่ใช้ร่วมกันหรือ DLL สิ่งนี้สร้างขึ้นโดยตัวเชื่อมโยงและทำหน้าที่ตั้งชื่อฟังก์ชันและรายการข้อมูลทั้งหมดที่ผู้ใช้ไลบรารีมองเห็นได้ สิ่งนี้ช่วยให้ระบบทำการเชื่อมโยงรันไทม์โดยการแก้ไขการอ้างอิงที่เปิดสำหรับชื่อเหล่านั้นไปยังตำแหน่งที่โหลดไลบรารีในหน่วยความจำ

หากคุณต้องการเรียนรู้เพิ่มเติมฉันขอแนะนำหนังสือ "Linkers and Loaders" ที่ยอดเยี่ยมของ John Levine ข้อความลิงก์


สวัสดีเบ็นในกรณีที่สองคุณหมายถึงตารางการส่งออกหรือไม่? นั่นคือตารางส่งออกเป็นกรณีพิเศษของตารางสัญลักษณ์หรือไม่? หรือแนวคิดที่ไม่เกี่ยวข้องเหล่านี้?
Pooven

สวัสดี. ฉันเชื่อว่ามันไม่ได้อยู่ในไฟล์ออบเจ็กต์ใด ๆ แต่อ้างอิงจากไฟล์เหล่านั้น ประการที่สองโปรดอธิบายเพิ่มเติมอีกเล็กน้อยว่า "สถานที่สุดท้าย" หมายถึงอะไร ที่อยู่จริงหรือที่อยู่สัมพัทธ์สุดท้ายในซอร์สโค้ด
stdout

26

โดยสังเขปคือการแมปชื่อที่คุณกำหนดตัวแปรให้กับที่อยู่ในหน่วยความจำรวมถึงข้อมูลเมตาเช่นประเภทขอบเขตและขนาด มันถูกใช้โดยคอมไพเลอร์

โดยทั่วไปไม่ใช่แค่ C [++] * ในทางเทคนิคจะไม่รวมที่อยู่หน่วยความจำโดยตรงเสมอไป ขึ้นอยู่กับภาษาแพลตฟอร์ม ฯลฯ ที่คอมไพเลอร์กำหนดเป้าหมาย


ฉันคิดว่าการพูดถึงเนื้อหาของที่อยู่นั้นสำคัญมากโดยพูดว่า "ไม่รวมที่อยู่หน่วยความจำโดยตรงเสมอไป"
stdout

13

ใน Linux คุณสามารถใช้คำสั่ง:

นาโนเมตร [ไฟล์วัตถุ]

เพื่อแสดงรายการตารางสัญลักษณ์ของอ็อบเจ็กต์ไฟล์นั้น จากผลงานพิมพ์นี้คุณสามารถถอดรหัสสัญลักษณ์ตัวเชื่อมโยงที่ใช้งานได้จากชื่อที่แตกต่างกัน


8

ตารางสัญลักษณ์คือรายการ "สัญลักษณ์" ในโปรแกรม / หน่วย สัญลักษณ์มักเป็นชื่อของตัวแปรหรือฟังก์ชัน ตารางสัญลักษณ์สามารถใช้เพื่อกำหนดตำแหน่งของตัวแปรหน่วยความจำหรือฟังก์ชันต่างๆ



0

ตารางสัญลักษณ์เป็นโครงสร้างข้อมูลที่สำคัญที่สร้างและดูแลโดยคอมไพลเลอร์เพื่อจัดเก็บข้อมูลเกี่ยวกับการเกิดขึ้นของเอนทิตีต่างๆเช่นชื่อตัวแปรชื่อฟังก์ชันอ็อบเจ็กต์คลาสอินเทอร์เฟซเป็นต้น


ตัวเชื่อมโยงและแอสเซมเบลอร์จัดการกับตารางสัญลักษณ์ด้วย (มักจะง่ายกว่าตารางสัญลักษณ์)
Basile Starynkevitch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.