เป็นไปได้ไหมที่ไลบรารี linux (เช่น "libloader.so") โหลดไลบรารีอื่นเพื่อแก้ไขสัญลักษณ์ภายนอก
ฉันมีโค้ดจำนวนมากที่ได้รับการคอมไพล์ตามเงื่อนไขเพื่อให้รองรับระดับ SIMD ( SSE2, AVX, AVX2 ) วิธีนี้ใช้ได้ผลดีหากแพลตฟอร์ม build เหมือนกับแพลตฟอร์มรันไทม์ แต่มันขัดขวางการนำโปรเซสเซอร์รุ่นต่างๆ มาใช้ซ้ำ
ความคิดหนึ่งคือการมี executable
ซึ่งเรียก function
เชื่อมโยงไปยัง libloader.so
ซึ่งไม่ได้ใช้ function
โดยตรง แต่จะแก้ไข (ผูก?) สัญลักษณ์นั้นจากไลบรารีที่โหลดอื่นเช่น libimpl_sse2.so
, libimpl_avx2.so
หรือมากกว่านั้นขึ้นอยู่กับ cpuflags
มีฟังก์ชันนับร้อยที่ต้องผูกแบบไดนามิกในลักษณะนี้ ดังนั้นการเปลี่ยนการประกาศหรือรหัสการโทรจึงไม่สามารถทำได้ การเชื่อมโยงโปรแกรมค่อนข้างง่ายที่จะเปลี่ยนแปลง ตัวแปรสภาพแวดล้อมรันไทม์สามารถเปลี่ยนแปลงได้ แต่ฉันไม่ต้องการ
ฉันได้ไกลถึงการสร้างปฏิบัติการที่สร้างและเริ่มต้นด้วยสัญลักษณ์ภายนอกที่ไม่ได้รับการแก้ไข (UES) ผ่านทางแฟล็ก ld --unresolved-symbols=ignore-all
แต่การโหลด impl lib ในภายหลังจะไม่เปลี่ยนค่าของฟังก์ชัน UES จาก NULL