มีวิธีโอเพนซอร์สที่จะทำให้คงที่จากการปฏิบัติการแบบไดนามิกที่ไม่มีความพร้อมของรหัสที่มา?


20

ให้ฉันอธิบายปัญหาด้วยตัวอย่าง ผมใช้โปรแกรมเก่าในวันที่ฉันไปทำงานวันเช่นตัวอย่างเช่นxfigและpdfedit

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

ถ้าโปรแกรมนั้นคอมไพล์ได้ง่ายตอนนี้บนระบบที่กำลังทำงานวิธีแก้ปัญหานั้นมีประโยชน์: ลองแฮ็กแหล่งที่มาเล็กน้อยและคอมไพล์มันแบบคงที่ --- โปรแกรมที่ได้นั้นจะมีขนาดใหญ่และไม่มีประสิทธิภาพ แต่มันจะทำงานสำหรับ อนาคตอันใกล้ (1) นี่เป็นกรณีของxfigและฉันจะลองโดยเร็วที่สุด

แต่ตัวอย่างเช่นpdfeditขึ้นอยู่กับ Qt3 และการตั้งค่าระบบเพื่อรวบรวมมันค่อนข้างซับซ้อนในเวลานี้ โชคดีที่มันสามารถทำงานได้ในตอนนี้ด้วยความจริงที่ว่าไลบรารีที่ต้องการไม่ขัดแย้งกับสิ่งใด แต่สิ่งนี้สามารถเปลี่ยนแปลงได้ในอนาคตดังนั้นฉันจึงต้องการแก้ไขปัญหานี้:

ฉันจะสร้างไบนารีแบบคงที่ได้อย่างไร (หรือสิ่งที่คล้ายกัน) ถ้าฉันมีไดนามิกและไลบรารีทั้งหมด แต่ไม่มีซอร์สโค้ดบน Ubuntu?

ฉันค้นหารอบ ๆ ความเป็นไปได้ทางหนึ่งคือตัวปรับสถานะ (2) แต่มีปัญหามากมายเกี่ยวกับการสุ่มที่อยู่ดังนั้นจึงไม่มีข้อแม้ Ermineรุ่นที่ไม่ใช่ฟรีดูเหมือนว่าจะทำงานได้ แต่ฉันต้องการตัวเลือกโอเพนซอร์ซจริงๆ

ความเป็นไปได้อีกอย่างคือการใช้นักเทียบท่าหรือระบบบรรจุภัณฑ์ที่คล้ายกัน แต่บทเรียนทั้งหมดที่ฉันพบนั้นค่อนข้างเน้น RedHat ; และตามจริงแล้วค่อนข้างซับซ้อนที่จะติดตาม


เชิงอรรถ :

(1) ไม่บ้ามาก ฉันใช้ffmpeg แบบสแตติกทำงานได้ดีและไม่มีปัญหาความเข้ากันได้ ...

(2) เพื่อรวบรวมstatifierดู/programming/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error

คำตอบ:


19

คุณสามารถแก้ปัญหาของคุณในวิธีอื่นและง่ายกว่า:

ใช้lddสำหรับปฏิบัติการของคุณเพื่อดูไลบรารีที่เชื่อมโยงตัวอย่างเช่น:

$ ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)

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

$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start

หรือคุณสามารถเข้าเพิ่มสำหรับโฟลเดอร์ lib /etc/ld.so.conf.d/ไปยัง แต่นั่นจะใช้การเปลี่ยนแปลงทั้งระบบ


นี่เป็นความคิดที่ดี --- แม้ว่าฉันจะต้องการหาวิธีที่จะรวมสิ่งทั้งหมดนี้ลงในไฟล์ปฏิบัติการ วิธีแก้ปัญหานี้อาจได้รับผลกระทบจากการเปลี่ยนแปลงในตัวโหลด (แม้ว่าฉันหวังว่าจะไม่มีใครทำสิ่งนี้ในแบบที่ไม่เข้ากันได้กับแบบย้อนหลัง) จะให้รางวัลแก่คุณหากไม่มีวิธีแก้ไขที่ดีกว่าเกิดขึ้น --- ขอบคุณ
Rmano

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

1
@ Klaus linux-vdso.so.1 ไม่สามารถมองเห็นได้ฉันคิดว่ามันอยู่ในเคอร์เนลใช่ไหม?
Rmano

1
ใช่. จากman 7 vdso: "The" vDSO "(virtual shared object) เป็น shared library ขนาดเล็กที่เคอร์เนลแมปลงในพื้นที่ที่อยู่ของแอปพลิเคชันพื้นที่ผู้ใช้ทั้งหมดโดยอัตโนมัติ"
Klaus D.

แม้ว่านี่จะไม่ใช่คำตอบสำหรับคำถามอย่างเคร่งครัดแต่ก็เป็นวิธีแก้ปัญหาที่สมเหตุสมผล ขอบคุณ
Rmano

2

ข้อเสนอแนะหนึ่งข้อเกี่ยวกับstatifier :

หากการสุ่มเลย์เอาต์พื้นที่ที่อยู่ (ASLR) ทำให้มันล้มเหลวคุณไม่จำเป็นต้องปิดมันสำหรับเครื่องทั้งหมด คุณสามารถปิดได้เฉพาะสำหรับกระบวนการนั้น:

$ setarch `uname -m` -R statified_pdfedit [args...]

มันจะเรียกใช้คำสั่งนั้นโดยปิดการใช้งานเค้าโครงแบบสุ่ม (ไม่จำเป็นต้องเป็นรูท)


ว้าวน่าสนใจ ตอนนี้ถ้าฉันสามารถรวบรวมstatifier...
Rmano

รวบรวมและตรวจสอบแล้ว xfig_statifiedแกนยังคงทิ้ง ... น่าเสียดาย ขอบคุณอยู่ดี
Rmano

ใช่น่าเสียดาย ฉันสงสัยว่ามันจะไม่ใช่ปัญหา 64 บิตหรือไม่ลองใช้ statifier ในการติดตั้งแบบ 32 บิตได้หรือไม่
lemonsqueeze

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