การเปลี่ยนไลบรารี่ที่เชื่อมโยงสำหรับไฟล์สั่งการที่กำหนด (CentOs 6)


29

ฉันมีลิงค์ที่ปฏิบัติการได้เช่นนี้:

  $ ldd a.out
        libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.

ตำแหน่งที่ไลบรารี libcrypto และ libssl openssl 1.0.0-fips libs ฉันต้องการทดสอบกับห้องสมุด 1.0.1 แทนดังนั้นฉันจึงสร้างมันในไดเรกทอรีหลักของฉัน มีวิธีที่a.outจะเชื่อมโยงกับห้องสมุด openssl ใหม่ของฉันโดยไม่เจ็บปวดมากหรือไม่? ฉันต้องการหลีกเลี่ยง

  • ต้องเชื่อมโยงอีกครั้งa.out(เนื่องจากเครื่องมือสร้างมีความซับซ้อนอย่างมาก)
  • การเปลี่ยนแปลงการตั้งค่าร่วม (เพราะผู้พัฒนารายอื่นทำงานกับเครื่องนี้)

เป็นไปได้ไหมที่จะทำสิ่งที่ฉันหวังไว้ที่นี่?

คำตอบ:


22

คุณสามารถแทนที่ไลบรารีอื่นชั่วคราวสำหรับการดำเนินการเฉพาะนี้ ใน Linux ตัวแปรสภาวะแวดล้อม LD_LIBRARY_PATH คือชุดของไดเร็กทอรีที่คั่นด้วยโคลอนซึ่งควรค้นหาไลบรารีก่อนก่อนที่จะมีชุดมาตรฐานของไดเร็กทอรี สิ่งนี้มีประโยชน์เมื่อทำการดีบักไลบรารีใหม่หรือใช้ไลบรารีที่ไม่เป็นมาตรฐานสำหรับวัตถุประสงค์พิเศษ ตัวแปรสภาวะแวดล้อม LD_PRELOAD แสดงรายการไลบรารีที่แบ่งใช้พร้อมกับฟังก์ชันที่แทนที่ชุดมาตรฐานเช่นเดียวกับ /etc/ld.so.preload - ห้องสมุดสาธารณะ

คุณยังสามารถเรียกใช้ตัวโหลดโดยตรง:

/lib/ld-linux.so.2 --library-path path executable


1
LD_LIBRARY_PATH ไม่ได้แทนที่เส้นทางการค้นหาเริ่มต้น ฉันตั้งค่าไว้ แต่ ldd ยังคงแสดงเส้นทางเริ่มต้นของระบบให้ฉันไม่ใช่เส้นทางที่ถูกเขียนทับ แม้ว่าฉันสามารถบังคับให้โหลดห้องสมุดของตัวเองได้โดยตั้งค่า LD_PRELOAD
Calmarius

18

เขียนสคริปต์ wrapper ที่ตั้งค่าLD_LIBRARY_PATHตัวแปรสภาพแวดล้อม นี่คือจี้ของPATHไลบรารีที่แบ่งปัน เส้นทางการค้นหาระบบจะค้นหาหลังจากไดเรกทอรีที่แสดงรายการอยู่$LD_LIBRARY_PATHเสมอ ดูคู่มือ linker แบบไดนามิกสำหรับการอ้างอิง

#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"

หรือสำหรับแบบครั้งเดียวโดยตรงบนบรรทัดคำสั่ง:

LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out

อีกทางหนึ่งถ้าคุณต้องการแก้ไขไบนารีลองchrpathซึ่งช่วยให้คุณแก้ไขเส้นทางการค้นหาไลบรารีที่อบในปฏิบัติการ


2
+1 chrpathสำหรับ สิ่งที่ฉันต้องการ
Raghav RV

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