คำถามติดแท็ก linker

ตัวเชื่อมโยงเป็นส่วนหนึ่งของ toolchain สำหรับการสร้างไฟล์ปฏิบัติการจากซอร์สโค้ดที่เขียนด้วยภาษาโปรแกรมที่คอมไพล์ ใช้รหัสออบเจ็กต์ที่คอมไพล์แล้วในไฟล์หลายไฟล์และสร้างไฟล์ปฏิบัติการไฟล์เดียวที่ "เชื่อมโยง"

5
จะระบุความชอบของไลบรารีพา ธ ได้อย่างไร?
ฉันกำลังรวบรวมโปรแกรม c ++ โดยใช้g++และld. ฉันมี.soไลบรารีที่ฉันต้องการใช้ระหว่างการเชื่อมโยง อย่างไรก็ตามมีไลบรารีที่มีชื่อเดียวกันอยู่/usr/local/libและldกำลังเลือกไลบรารีนั้นทับไลบรารีที่ฉันระบุโดยตรง ฉันจะแก้ไขปัญหานี้ได้อย่างไร? สำหรับตัวอย่างด้านล่างไฟล์ไลบรารีของฉันคือ/my/dir/libfoo.so.0. สิ่งที่ฉันลองแล้วไม่ได้ผล: คำสั่ง g ++ ของฉันคือ g++ -g -Wall -o my_binary -L/my/dir -lfoo bar.cpp เพิ่ม/my/dirไปยังจุดเริ่มต้นหรือจุดสิ้นสุดของ$PATHตัวแปร en` ของฉัน เพิ่ม/my/dir/libfoo.so.0เป็นอาร์กิวเมนต์ให้กับ g ++
96 c++  linker  g++ 

4
ฉันสามารถเปลี่ยน 'rpath' ในไบนารีที่คอมไพล์แล้วได้หรือไม่?
ฉันมีไฟล์ปฏิบัติการเก่าที่กำหนดไว้สำหรับกองเศษซาก แต่ยังไม่มี มันขึ้นอยู่กับ libs บางตัวที่ถูกลบออกจากสภาพแวดล้อมของฉัน แต่ฉันมี Stub libs บางที่ที่มันใช้งานได้ดี Id ต้องการชี้ไฟล์ปฏิบัติการนี้ไปยัง Stub libs เหล่านี้ ใช่ฉันสามารถตั้งค่า LD_LIBRARY_PATH ได้ แต่ไฟล์ปฏิบัติการนี้ถูกเรียกใช้จากหลายสคริปต์และผู้ใช้จำนวนมากและฉันต้องการแก้ไขในจุดเดียว ฉันไม่มีแหล่งข้อมูลสำหรับสิ่งนี้และคงยากที่จะได้รับมัน ฉันคิดว่า - ฉันสามารถแก้ไขไฟล์นี้โดยใช้โปรแกรมแก้ไข ELF Awareness และเพิ่ม PATH แบบธรรมดาให้กับ rpath เพื่อให้มันเข้าสู่ libs ใหม่ได้หรือไม่ เป็นไปได้หรือไม่หรือเมื่อคุณสร้างไบนารี ELF คุณแก้ไขสิ่งต่าง ๆ ในสถานที่และไม่สามารถเคลื่อนย้ายได้?
96 linux  linker  elf 


1
ความแตกต่างระหว่าง -rpath และ -L คืออะไร?
gccและldมีหลายวิธีในการระบุเส้นทางการค้นหาสำหรับไลบรารี - ระหว่างนั้น-rpathและ-Lแฟล็ก การจัดการไม่เปิดเผยความแตกต่างระหว่างแฟล็กทั้งสองนี้อย่างมีประสิทธิภาพโดยบอกว่าแต่ละแฟล็กจะเพิ่มไลบรารีไปยังพา ธ การค้นหาไลบรารี แต่ก็ดูแปลกที่ธงทั้งสองทำเหมือนกันทุกประการ อะไรคือความแตกต่างระหว่างสองตัวเลือกนี้?

5
ข้อผิดพลาด "ไม่มีข้อมูลเวอร์ชัน" จาก linux dynamic linker หมายความว่าอย่างไร
ในผลิตภัณฑ์ของเราเราจัดส่งไบนารีลินุกซ์บางตัวที่เชื่อมโยงกับไลบรารีระบบแบบไดนามิกเช่น "libpam" ในระบบลูกค้าบางระบบเราได้รับข้อผิดพลาดต่อไปนี้บน stderr เมื่อโปรแกรมทำงาน: ./authpam: /lib/libpam.so.0: no version information available (required by authpam) แอปพลิเคชันทำงานได้ดีและรันโค้ดจากไลบรารีไดนามิก นี่ไม่ใช่ข้อผิดพลาดร้ายแรง แต่เป็นเพียงคำเตือน ฉันคิดว่านี่เป็นข้อผิดพลาดมาจากตัวเชื่อมโยงแบบไดนามิกเมื่อไลบรารีที่ติดตั้งระบบขาดสิ่งที่เรียกใช้งานได้ของเรา ฉันไม่รู้อะไรมากเกี่ยวกับภายในของกระบวนการลิงก์แบบไดนามิก ... และการเข้าสู่หัวข้อนั้นไม่ได้ช่วยอะไรมาก :( ใครทราบสาเหตุของข้อผิดพลาดนี้ ... จะวินิจฉัยสาเหตุได้อย่างไร? ... และเราจะเปลี่ยนไฟล์ปฏิบัติการเพื่อหลีกเลี่ยงปัญหานี้ได้อย่างไร? อัปเดต: ลูกค้าอัปเกรดเป็น "การทดสอบ" เดเบียนเวอร์ชันล่าสุดและเกิดข้อผิดพลาดเดียวกัน ดังนั้นจึงไม่ใช่ไลบรารี libpam ที่ล้าสมัย ฉันเดาว่าฉันต้องการที่จะเข้าใจสิ่งที่ผู้เชื่อมโยงกำลังบ่น? ฉันจะตรวจสอบสาเหตุที่แท้จริง ฯลฯ ได้อย่างไร
91 linux  linker 

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