ฉันจะเก็บสัญลักษณ์ไว้ระหว่างแถบ gcc ได้อย่างไร

เมื่อใช้ arm-linux-gnueabi-gcc ฉันกำลังทำงานกับวัตถุที่ใช้ร่วมกันซึ่งมีการอ้างอิงถึง main ที่ไม่ได้กำหนด ฉันใช้ dlopen() เพื่อเปิดไลบรารีนี้ อย่างไรก็ตาม เมื่อโปรแกรมของฉันคอมไพล์ด้วย -Wl,-s สัญลักษณ์ main จะถูกลบออก ซึ่งทำให้ dlopen() ล้มเหลวด้วยสัญลักษณ์ main ที่ไม่ได้กำหนด

ใน gcc มีวิธีใดบ้างที่ฉันสามารถแถบได้ แต่คงสัญลักษณ์หลักไว้

แก้ไข: ยิ่งไปกว่านั้น ฉันสามารถใส่เฉพาะสัญลักษณ์ main ในส่วนไดนามิก (คล้ายกับ -rdynamic) ได้หรือไม่


person Maxthecat    schedule 22.06.2020    source แหล่งที่มา


คำตอบ (1)


อ็อบเจ็กต์ที่ใช้ร่วมกันซึ่งมีการอ้างอิงไปยัง main ไม่ได้กำหนดไว้ ดูเหมือนจะใช้ตารางสัญลักษณ์ไดนามิกเพื่อค้นหาการอ้างอิงถึง main ดังนั้นจึงมีสองตัวเลือกที่นี่:

  1. คอมไพล์ด้วย -Wl,-rdynamic นี่จะเป็นการใส่สัญลักษณ์ทั้งหมดลงในตารางสัญลักษณ์แบบไดนามิก วิธีนี้ใช้ได้ผล แต่ส่งผลให้มีการใส่สัญลักษณ์พิเศษจำนวนมากเข้าไปด้วย

  2. คอมไพล์ด้วย -Wl,--dynamic-list=[path to my list file] จากนั้นแสดงรายการ main ในไฟล์ไดนามิกเพื่อเก็บเฉพาะ main ในตารางสัญลักษณ์ไดนามิก นี่เป็นข้อเสียตรงที่ตอนนี้ต้องจัดการการอ้างอิงไดนามิกทั้งหมด แต่สำหรับโปรแกรมทั่วไป นี่ก็เพียงพอแล้ว

ตัวอย่างของ (2):

คำขอ:

 arm-linux-gnueabi-gcc -fPIC mycode.c -Wl,-s,--dynamic-list=./dynamic_symbols.txt

dynamic_สัญลักษณ์.txt:

{ main; };
person Maxthecat    schedule 22.06.2020