คำถามติดแท็ก dynamic-linking

ในการคำนวณการเชื่อมโยงแบบไดนามิกเป็นกระบวนการของระบบปฏิบัติการ (OS) ที่โหลด (คัดลอกจากหน่วยเก็บข้อมูลถาวรไปยัง RAM) และลิงก์ (เติมตารางกระโดดและย้ายตัวชี้) ไลบรารีที่ใช้ร่วมกันที่จำเป็นสำหรับการเรียกใช้งานในขณะทำงานนั่นคือ เมื่อดำเนินการ

1
การใช้ libc สำรองกับ ld-linux.so hacks; วิธีทำความสะอาด?
ฉันมีระบบดั้งเดิมที่มี glibc ที่เก่ามากซึ่งเราไม่สามารถอัพเกรดได้โดยไม่ต้องมีการทดสอบ / ตรวจสอบความถูกต้อง ฉันจำเป็นต้องเรียกใช้โปรแกรมใหม่ (เช่น Java 1.7) บนระบบนั้นหลายครั้งแล้ว ฉันเลือกโซลูชัน chroot ที่ฉันจัดเก็บ libs ที่จำเป็นทั้งหมดและเรียกใช้บริการใน chroot แม้ว่า chroot จะมีข้อ จำกัด มากและฉันอยากจะลองแก้ปัญหาด้วย LD_LIBRARY_PATH น่าเสียดายที่ฉันได้รับข้อผิดพลาดlibc.so.6: cannot handle TLS dataเมื่อฉันลองทำ ปรากฎว่าฉันต้องการ/lib/ld-linux.so.2จาก chroot เช่นกัน งานนี้: LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program อย่างไรก็ตามjavaเกียดเคล็ดลับของฉันโดยการตรวจสอบ/proc/self/cmdlineเพื่อกำหนดที่จะโหลดห้องสมุดจากซึ่งล้มเหลวหากไบนารีไม่ได้ชื่อว่า 'bin / java' นอกจากนี้ java เรียกใช้ตัวเองในระหว่างการเริ่มต้นปัญหาที่ซับซ้อนมากขึ้น ในความพยายามครั้งสุดท้ายที่จะทำให้งานนี้ฉันเปิดไบนารี Java ด้วยโปรแกรมแก้ไขฐานสิบหกและแทนที่สตริง/lib/ld-linux.so.2ด้วย/home/chroot/ld.so(และทำให้ symlink เป็นld-linux.so.2) และทำงานได้! แต่ฉันคิดว่าทุกคนจะเห็นด้วยว่ามันเป็นกระบองขนาดใหญ่ที่จะเขียนเส้นทางของไบนารีใหม่ทุกตัวไปยังเส้นทางที่แน่นอนของระบบซ้อน ไม่มีใครรู้วิธีที่สะอาดกว่าการใช้เส้นทางไลบรารีที่กำหนดเองรวมถึง ld-linux.so …

1
Linux, GNU GCC, ld, สคริปต์เวอร์ชันและรูปแบบไบนารีของ ELF - มันทำงานอย่างไร
ฉันพยายามเรียนรู้เพิ่มเติมเกี่ยวกับการกำหนดเวอร์ชันของไลบรารีใน Linux และวิธีการทำให้ทุกอย่างทำงานได้ นี่คือบริบท: - ฉันมีสองรุ่นของห้องสมุดแบบไดนามิกซึ่งเผยให้เห็นชุดเดียวกันของอินเตอร์เฟซพูดและlibsome1.solibsome2.so - libsome1.soโปรแกรมที่มีการเชื่อมโยงกับ - โปรแกรมนี้จะใช้ในการโหลดแบบไดนามิกโมดูลอื่นพูดlibdl.solibmagic.so - ตอนนี้มีการเชื่อมโยงกับlibmagic.so libsome2.soเห็นได้ชัดโดยไม่ต้องใช้สคริปต์ลิงเกอร์สัญลักษณ์ซ่อนตัวอยู่ในlibmagic.soที่เวลาทำงานทุกสายอินเตอร์เฟซในการได้รับการแก้ไขไปlibsome2.so libsome1.soนี้ได้รับการยืนยันโดยการตรวจสอบค่าส่งกลับโดยเทียบกับมูลค่าของแมโครlibVersion()LIB_VERSION - ดังนั้นฉันลองถัดไปเพื่อคอมไพล์และเชื่อมโยงlibmagic.soกับสคริปต์ linker ซึ่งซ่อนสัญลักษณ์ทั้งหมดยกเว้น 3 ซึ่งกำหนดไว้ในlibmagic.soและถูกส่งออกโดยมัน ใช้งานได้ ... หรืออย่างน้อยที่สุดlibVersion()และLIB_VERSIONค่าตรงกัน (และรายงานรุ่น 2 ไม่ใช่ 1) - อย่างไรก็ตามเมื่อโครงสร้างข้อมูลบางอย่างต่อเนื่องเป็นดิสก์ฉันสังเกตเห็นความเสียหายบางอย่าง ในไดเรกทอรีของแอปพลิเคชันหากฉันลบlibsome1.soและสร้างลิงค์ซอฟต์ลิสต์ในตำแหน่งที่จะชี้ไปlibsome2.soทุกอย่างทำงานได้ตามที่คาดหวังและความเสียหายเดียวกันจะไม่เกิดขึ้น ฉันอดไม่ได้ที่จะคิดว่าสิ่งนี้อาจเกิดขึ้นเนื่องจากความขัดแย้งในการแก้ปัญหาสัญลักษณ์ของลิงเกอร์ ฉันได้ลองหลายสิ่งหลายอย่างเช่นพยายามเชื่อมโยงlibsome2.soเพื่อให้สัญลักษณ์ทั้งหมดเป็นสัญลักษณ์symbol@@VER_2(ซึ่งฉันยังสับสนอยู่เพราะคำสั่งnm -CD libsome2.soยังคงแสดงสัญลักษณ์เป็นsymbolและไม่ใช่symbol@@VER_2) ... ดูเหมือนจะไม่มีอะไรทำงาน !!! ช่วยด้วย!!!!!!

2
ตัวเชื่อมโยง / ตัวโหลดเดอร์แบบไดนามิกสามารถลิงก์แบบไดนามิกตามที่รายงานโดย `ไฟล์ 'ได้อย่างไร
พิจารณาการพึ่งพาวัตถุที่ใช้ร่วมกัน/bin/bashซึ่งรวมถึง/lib64/ld-linux-x86-64.so.2(dynamic linker / loader): ldd /bin/bash linux-vdso.so.1 (0x00007fffd0887000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f57a04e3000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f57a04de000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f57a031d000) /lib64/ld-linux-x86-64.so.2 (0x00007f57a0652000) การตรวจสอบ/lib64/ld-linux-x86-64.so.2แสดงให้เห็นว่ามันเป็น symlink ไปที่/lib/x86_64-linux-gnu/ld-2.28.so: ls -la /lib64/ld-linux-x86-64.so.2 lrwxrwxrwx 1 root root 32 May 1 19:24 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.28.so นอกจากนี้fileรายงานของ/lib/x86_64-linux-gnu/ld-2.28.soตัวเองยังเชื่อมโยงแบบไดนามิก: file -L /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2: ELF 64-bit LSB pie executable, x86-64, …

2
ไม่สามารถดำเนินการไบนารีใน NixOS - ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
ฉันพยายามติดตั้ง oracle jre ปัจจุบันบน VM ที่ใช้ NixOS ต่อไปนี้เกิดขึ้น: [michas@cc:~]$ tar xvzf jre-7u40-linux-x64.tar.gz |grep bin/java jre1.7.0_40/bin/javaws jre1.7.0_40/bin/java_vm jre1.7.0_40/bin/java [michas@cc:~]$ ls -l ./jre1.7.0_40/bin/java -rwxr-xr-x 1 michas nogroup 7750 Aug 27 09:17 ./jre1.7.0_40/bin/java [michas@cc:~]$ ./jre1.7.0_40/bin/java bash: ./jre1.7.0_40/bin/java: No such file or directory WTF? ไฟล์ที่ระบุชื่อนั้นชัดเจน เกิดอะไรขึ้น? พยายามวิเคราะห์เพิ่มเติม: [michas@cc:~]$ strace ./jre1.7.0_40/bin/java execve("./jre1.7.0_40/bin/java", ["./jre1.7.0_40/bin/java"], [/* 53 …

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

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

1
ส่วนไหนของเอลฟ์ที่ปฏิบัติการได้ถูกโหลดเข้าสู่หน่วยความจำและที่ไหน
สิ่งที่ฉันรู้แล้ว: ปฏิบัติการของ ELF นั้นมีหลายส่วนโดยเฉพาะอย่างยิ่งส่วน. text และ. data ที่ถูกโหลดเข้าสู่หน่วยความจำเนื่องจากเป็นส่วนหลักของโปรแกรม แต่สำหรับโปรแกรมที่ทำงานมันต้องการข้อมูลเพิ่มเติมโดยเฉพาะเมื่อเชื่อมโยงแบบไดนามิก สิ่งที่ฉันสนใจคือส่วนต่างๆเช่น. plt, .got, .dynamic, .dynsym, .dynstr etcetera ส่วนต่างๆของเอลฟ์ที่รับผิดชอบการเชื่อมโยงฟังก์ชั่นไปยังที่อยู่ จากสิ่งที่ฉันสามารถคิดได้จนถึงตอนนี้ก็คือสิ่งต่าง ๆ เช่น. symtab และ. strtab ไม่ได้รับการโหลด (หรือไม่อยู่) ในหน่วยความจำ แต่ .dynsym และ. dynstr ถูกใช้โดย linker หรือไม่ พวกเขาอยู่ในความทรงจำหรือไม่? ฉันสามารถเข้าถึงได้จากรหัสโปรแกรมหรือไม่ และมีส่วนใดของปฏิบัติการที่อยู่ในหน่วยความจำเคอร์เนล? ความสนใจของฉันในเรื่องนี้ส่วนใหญ่เป็นนิติวิทยาศาสตร์ แต่ข้อมูลใด ๆ ในหัวข้อนี้จะช่วยได้ ทรัพยากรที่ฉันได้อ่านเกี่ยวกับตารางเหล่านี้และการเชื่อมโยงแบบไดนามิกอยู่ในระดับสูงมากขึ้นพวกเขาอธิบายเฉพาะการทำงานไม่ใช่สิ่งที่เป็นประโยชน์เกี่ยวกับเนื้อหาในหน่วยความจำ แจ้งให้เราทราบหากมีข้อสงสัยเกี่ยวกับคำถามของฉัน

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

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