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

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

4
หมายเลข SO (วัตถุที่ใช้ร่วมกัน) ทำงานอย่างไร
ฉันทราบว่าวัตถุที่ใช้ร่วมกันภายใต้ Linux ใช้ "หมายเลข" คือวัตถุที่ใช้ร่วมกันรุ่นต่าง ๆ จะได้รับส่วนขยายต่างกันตัวอย่างเช่น example.so.1 example.so.2 ฉันเข้าใจความคิดที่จะมีสองไฟล์ที่แตกต่างกันเช่นที่ไลบรารีสองเวอร์ชันสามารถมีอยู่บนระบบ (ตรงข้ามกับ "DLL Hell" บน Windows) ฉันต้องการที่จะรู้วิธีการทำงานในทางปฏิบัติ? บ่อยครั้งที่ผมเห็นว่าexample.soในความเป็นจริงการเชื่อมโยงสัญลักษณ์example.so.2ที่.2เป็นรุ่นล่าสุด แอปพลิเคชันนั้นขึ้นอยู่กับเวอร์ชันที่เก่ากว่าของการexample.soระบุว่าถูกต้องอย่างไร มีกฎใดที่ต้องใช้ตัวเลขหรือไม่ หรือนี่เป็นเพียงแค่การประชุม? เป็นกรณีที่ไม่เหมือนกับใน Windows ที่มีการถ่ายโอนซอฟต์แวร์ระหว่างระบบหากระบบมีวัตถุที่ใช้ร่วมกันรุ่นใหม่กว่ามันถูกเชื่อมโยงไปยังรุ่นที่เก่ากว่าโดยอัตโนมัติเมื่อรวบรวมจากแหล่งที่มาหรือไม่ ฉันสงสัยว่าสิ่งนี้เกี่ยวข้องกับldconfigแต่ไม่แน่ใจว่าจะทำอย่างไร

4
แฟ้มปฏิบัติการค้นหาวัตถุที่ใช้ร่วมกันที่รันไทม์ที่ไหน
ฉันเข้าใจวิธีกำหนดรวมวัตถุที่ใช้ร่วมกันในการเชื่อมโยง / รวบรวมเวลา อย่างไรก็ตามฉันยังสงสัยว่าไฟล์เรียกทำงานค้นหาวัตถุที่ใช้ร่วมกัน ( *.soไลบรารี) ณ เวลาดำเนินการอย่างไร ตัวอย่างเช่นแอปของฉันa.outเรียกฟังก์ชั่นที่กำหนดไว้ในlib.soห้องสมุด หลังจากรวบรวมฉันย้ายไปยังไดเรกทอรีใหม่ของฉันlib.so$HOME ฉันa.outจะบอกให้ไปหาที่นั่นได้อย่างไร

2
การได้รับข้อความ“ ไม่พบ” เมื่อเรียกใช้ไบนารีแบบ 32 บิตบนระบบ 64 บิต
ขณะนี้ฉันมีปัญหาแปลก ๆ เกี่ยวกับเดเบียน (เสียงฮืด ๆ / amd64) ฉันได้สร้าง chroot เพื่อติดตั้งเซิร์ฟเวอร์ (ฉันไม่สามารถให้รายละเอียดเพิ่มเติมเกี่ยวกับมันขอโทษ) /chr_path/ขอเรียกเส้นทางของมัน เพื่อทำให้สิ่งต่าง ๆ เป็นเรื่องง่ายฉันได้เริ่มต้น chroot นี้ด้วย debootstrap (เช่น wheezy / amd64) ทั้งหมดดูเหมือนจะทำงานได้ดีภายใน chroot แต่เมื่อฉันเริ่มสคริปต์การติดตั้งของเซิร์ฟเวอร์ของฉันฉันได้รับ: zsh: Not found /some_path/perl(โปรแกรมติดตั้งมีไบนารี Perl ด้วยเหตุผลบางอย่าง) โดยปกติฉันตรวจสอบ/some_path/สถานที่และพบไบนารี "perl" fileในสภาพแวดล้อม chroot ส่งคืน: /some_path/perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared …

7
วิธีการค้นหาไฟล์ไลบรารีแบบไดนามิกที่โหลดได้เมื่อรัน?
ฉันต้องการค้นหารายการไลบรารีแบบไดนามิกที่โหลดแบบไบนารีเมื่อทำงาน (ด้วยเส้นทางแบบเต็ม) ฉันใช้ CentOS 6.0 ทำอย่างไร

5
การเรียกระบบใดที่ใช้เพื่อโหลดไลบรารีใน Linux
ในstraceเอาต์พุตพา ธ ไปยังไลบรารีที่เรียกใช้งานการเรียกใช้อยู่ในการเรียกopen()ใช้ นี่เป็นการเรียกระบบที่ใช้โดยโปรแกรมที่เชื่อมโยงแบบไดนามิกหรือไม่? เกี่ยวกับdlopen()อะไร open()ไม่ใช่สายที่ฉันเดาได้ว่าจะมีบทบาทในการทำงานของโปรแกรม

3
ค้นหาตำแหน่งที่เป็นสัญลักษณ์ไลบรารีแบบแบ่งใช้ที่กำหนดบนระบบสด / รายการสัญลักษณ์ทั้งหมดที่เอ็กซ์พอร์ตบนระบบ
โดยทั่วไปนี่เป็นคำถามสองข้อในคำถามเดียวเพราะถ้าฉันสามารถแสดงรายการสัญลักษณ์ทั้งหมดที่ส่งออกภายในระบบพร้อมกับเส้นทางไลบรารีที่ใช้ร่วมกันของพวกเขาฉันก็สามารถแสดงgrepผลลัพธ์นั้นได้ สำหรับสัญลักษณ์เคอร์เนลฉันคิดว่ามันค่อนข้างง่าย - เพราะเราสามารถcat /proc/kallsymsรับรายการสัญลักษณ์ทั้งหมดของโมดูลเหล่านั้นที่โหลดในหน่วยความจำ จากนั้นsudo cat /proc/modulesจะให้รายการของโมดูลที่โหลดพร้อมที่อยู่ แต่ไม่ใช่เส้นทางที่มีการโหลดโมดูลจาก (หากพวกเขาถูกสร้างเป็นวัตถุที่แยกออกจากกันเป็นต้นไม้. ko) ตัวอย่างเช่นฉันพยายามติดตามโปรแกรมkstโดยใช้ltrace: $ ltrace kst2 ... _ZNK13QGraphicsItem10parentItemEv(0xa1ccdb4, 0, 0xbfe631a8, 0x823652b, 0xbfe63298) = 0xa1ce854 __dynamic_cast(0xa1ce854, 0x839ff00, 0x8306b80, 84, 0xbfe63298) = 0xa1ce800 _ZNK13QGraphicsItem10parentItemEv(0xa1ccdb4, 0x839ff00, 0x8306b80, 84, 0xbfe63298) = 0xa1ce854 __dynamic_cast(0xa1ce854, 0x839ff00, 0x8306b80, 84, 0xbfe63298) = 0xa1ce800 ... ... และฉันต้องการทราบว่าที่_ZNK13QGraphicsItem10parentItemEvอยู่นี้ ดังนั้นจะทำอย่างไรกับสัญลักษณ์ไลบรารีที่แชร์ การอ่านผ่าน[gcc-help] Re: …

4
ปฏิบัติการ Linux ล้มเหลวด้วย“ ไม่พบไฟล์” แม้ว่าไฟล์จะอยู่ที่นั่นและใน PATH
ฉันต้องการเปิดใช้งานwineexecutable (เวอร์ชั่น 2.12) แต่ฉันได้รับข้อผิดพลาดต่อไปนี้ ( $= shell prompt): $ wine bash: /usr/bin/wine: No such file or directory $ /usr/bin/wine bash: /usr/bin/wine: No such file or directory $ cd /usr/bin $ ./wine bash: ./wine: No such file or directory อย่างไรก็ตามไฟล์อยู่ที่นั่น: $ which wine /usr/bin/wine ปฏิบัติการที่แน่นอนอยู่ที่นั่นและไม่มี symlink ที่ไม่ทำงาน: $ stat /usr/bin/wine File: …

2
จะอัพเกรดไลบรารีที่แชร์โดยไม่มีข้อผิดพลาดได้อย่างไร
ที่นี่มันบอกว่าคุณสามารถเขียนไฟล์ปฏิบัติการใหม่และกระบวนการจะทำงานได้ดี - มันจะถูกอ่านอีกครั้งเมื่อกระบวนการรีสตาร์ท อย่างไรก็ตามเมื่อฉันพยายามที่จะแทนที่ไฟล์ไบนารีในขณะที่กระบวนการกำลังทำงาน (กับ scp จาก dev เป็นเซิร์ฟเวอร์ทดสอบ) ก็ระบุว่า 'ไฟล์ไม่ว่าง' และถ้าฉันแทนที่ไฟล์ไลบรารีที่ใช้ร่วมกัน (* .so) กระบวนการทั้งหมดที่ลิงก์ล้มเหลว ทำไมเป็นเช่นนั้น ฉันพลาดอะไรไปรึเปล่า? ฉันจะแทนที่ไฟล์ไบนารีโดยไม่หยุด / หยุดทำงานกระบวนการได้อย่างไร

1
เหตุใดจึงไม่ระบบ Unix / Linux ทราเวิร์ผ่านไดเรกทอรีจนกว่าพวกเขาจะพบรุ่นที่ต้องการของห้องสมุดที่เชื่อมโยง?
ฉันมีไบนารีปฏิบัติการที่ชื่อว่า "alpha" ที่ต้องการไลบรารีที่เชื่อมโยง (libz.so.1.2.7) ซึ่งวางไว้ที่ /home/username/myproduct/lib/libz.so.1.2.7 ฉันส่งออกไปยังอินสแตนซ์ของเทอร์มินัลของฉันก่อนที่จะวางไข่ไบนารีที่ปฏิบัติการได้ของฉันโดยดำเนินการคำสั่งต่อไปนี้ export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH ตอนนี้เมื่อฉันวางไข่แอปพลิเคชั่น "ไชโย" อื่นที่ต้องใช้ไลบรารีเดียวกัน แต่เป็นเวอร์ชั่นที่แตกต่างกันคือ (libz.so.1.2.8) ซึ่งมีอยู่ใน /lib/x86_64-linux-gnu/libz.so.1.2.8ระบบระบบจะพ่นข้อผิดพลาดต่อไปนี้ version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2) หากฉันยกเลิกการตั้งค่าLD_LIBRARY_PATH"ไชโย" จะเริ่มต้นได้ดี ฉันเข้าใจว่าพฤติกรรมดังกล่าวเป็นเพราะLD_LIBRARY_PATHมีความสำคัญเหนือเส้นทางไดเรกทอรีที่กำหนดใน/etc/ld.so.confขณะที่ค้นหาห้องสมุดที่เชื่อมโยงและดังนั้นข้อผิดพลาดดังกล่าวเกิดขึ้น ฉันแค่อยากรู้ว่าทำไมนักพัฒนาของ UNIX / LINUX จึงไม่ได้ออกแบบระบบปฏิบัติการเพื่อค้นหาไลบรารี่ที่เชื่อมโยงในไดเรกทอรีอื่นตามลำดับชั้นหากอินสแตนซ์แรกของไลบรารี่เป็นเวอร์ชันที่แตกต่างกัน พูดง่ายๆก็คือระบบ UNIX / LINUX จะผ่านกลุ่มของไดเรกทอรีต่างๆจนกว่าจะพบไลบรารีที่ต้องการ แต่ทำไมมันไม่ทำอย่างนั้นจนกว่ามันจะพบกับเวอร์ชั่นที่คาดหวังมากกว่าจะยอมรับอินสแตนซ์แรกของไลบรารี่โดยไม่คำนึงถึงเวอร์ชันของมัน?

9
ปัญหาในการเปิดจาวาที่ Debian:“ เกิดข้อผิดพลาดขณะโหลดไลบรารีที่แชร์: libjli.so”
ฉันพยายามที่จะเปิดตัวจาวา: $ java -version java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory $ ldd /usr/lib/jvm/java-6-openjdk/jre/bin/java linux-gate.so.1 => (0xb779f000) libz.so.1 => /usr/lib/libz.so.1 (0xb7780000) libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7767000) libjli.so => /usr/lib/jvm/java-6-openjdk/jre/bin/../lib/i386/jli/libjli.so (0xb7762000) libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb775e000) libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7603000) /lib/ld-linux.so.2 (0xb77a0000 $ …

1
การติดตั้งสอง glibc พร้อมกับ debian / ubuntu
เป็นไปได้หรือไม่ที่จะติดตั้งและใช้ glibc เวอร์ชั่นต่างกันสองเครื่องในเครื่องเดียวกัน ที่หนึ่งรุ่นใช้เพื่อรันซอฟต์แวร์รุ่นเก่าเท่านั้นซึ่งต้องอาศัยไบนารี glibc รุ่นเก่า เป็นไปได้หรือไม่ที่จะทำเช่นนั้นด้วยความช่วยเหลือของผู้จัดการแพ็คเกจ (บางอย่างเช่น "ติดตั้งแพ็คเกจนี้และการอ้างอิงไปยัง/opt/old-glibc) แทนที่จะจัดการมันให้น่ากลัว

3
ค้นหาว่าห้องสมุดอยู่ในเส้นทางหรือไม่
สมมติว่าฉันต้องการทดสอบว่ามีการติดตั้งไลบรารีและใช้งานได้โดยโปรแกรมหรือไม่ ฉันสามารถใช้ldconfig -p | grep mylibเพื่อดูว่ามีการติดตั้งในระบบหรือไม่ แต่ถ้าห้องสมุดเป็นที่รู้จักกันเพียงผ่านการตั้งค่าLD_LIBRARY_PATH? ในกรณีนั้นโปรแกรมอาจหาห้องสมุดได้ แต่ldconfigจะไม่ทำเช่นนั้น ฉันจะตรวจสอบว่าห้องสมุดอยู่ในเส้นทางลิงเกอร์รวมกันได้อย่างไร ฉันจะเพิ่มว่าฉันกำลังมองหาวิธีการแก้ปัญหาที่จะทำงานแม้ว่าฉันจะไม่ได้มีโปรแกรมที่อยู่ในมือ (เช่นโปรแกรมยังไม่ได้รวบรวม) ฉันแค่อยากจะรู้ว่ามีห้องสมุดอยู่ในld' เส้นทางของ


2
ฉันสามารถใช้ ld.so.cache ของตัวเองได้หรือไม่?
ldconfig มีสองตัวเลือกที่น่าสนใจ: -f conf Use conf instead of /etc/ld.so.conf. -C cache Use cache instead of /etc/ld.so.cache. ฉันพยายามคัดลอก/etc/ld.so.confไปยังโฮมไดเร็กตอรี่ของฉันเอง, และแก้ไขมันเพื่อรวมพา ธ ไปยังไลบรารี่ในท้องถิ่นของฉัน/home/syockit/local/usr/libเป็นต้นและวิ่งไป ldconfig -f /home/syockit/ld.so.conf -C /home/syockit/ld.so.cache และต่อมาเพื่อยืนยันว่าไลบรารีถูกแคชฉันก็วิ่ง ldconfig -f /home/syockit/ld.so.conf -C /home/syockit/ld.so.cache -p | less และมันรวมไลบรารีทั้งหมดของฉันไว้ด้านบนรวมถึงไลบรารีระบบด้วย ตอนนี้ฉันต้องการให้ลิงเกอร์เริ่มต้นใช้สองสิ่งนี้ แต่ในman ld.soผมเห็นไม่มีการเอ่ยถึงความสามารถในการใช้งานที่กำหนดเองหรือ.conf .cacheแล้วจุดของสองตัวเลือกข้างต้นldconfigนั้นคืออะไร?

1
ลำดับที่ตัวเชื่อมโยงแบบไดนามิกของ Linux ค้นหาเส้นทางคืออะไร
/etc/ld.so.confนี้ไม่ได้เป็นที่ซ้ำกันเพราะนี่คือการจัดการกับความไม่ชอบมาพากลผมสังเกตเห็นเมื่อฉันใช้ ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"เพื่อให้ได้เส้นทางที่ใช้การค้นหาแบบไดนามิกในลิงเกอร์สำหรับห้องสมุดผมเรียกใช้คำสั่ง เมื่อ/etc/ld.so.confไม่มีเส้นทางที่ระบุไว้ในนั้น เอาต์พุตจากคำสั่งก่อนหน้าคือ /lib /usr/lib ฉันคิดว่ามันค้นหาเป็นครั้งแรกแล้ว/lib /usr/libเมื่อฉันเพิ่มเส้นทางใหม่เช่น/usr/local/libไปยัง/etc/ld.so.confแล้วสร้างใหม่/etc/ld.so.cacheผลลัพธ์จากการldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"กลายเป็น /usr/local/lib /lib /usr/lib ฉันพบนี้แปลกเพราะถ้าผมถูกต้องว่าคำสั่งที่ระบุไว้ไดเรกทอรีที่มีการค้นหาในคือจากบนลงล่างแล้วไดเรกทอรีเพิ่มเติมที่จะค้นหาก่อนและ/lib /usr/libว่าไดเรกทอรีเพิ่มเติมที่จะค้นหาก่อนไดเรกทอรีที่เชื่อถือได้ไม่แปลกในตัวเอง แต่เมื่อ/libมีการค้นหาก่อน/usr/libที่แปลกเพราะ/binและ/sbinมีการค้นหาหลังจาก/usr/binและใน/usr/sbinPATH แม้ว่าเส้นทางที่ระบุไว้โดยldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"ถูกค้นจากด้านล่างสู่ด้านบนก็จะยังคงสั่งเบ้เพราะไดเรกทอรีเพิ่มเติมจะได้รับการสืบค้นหลังจากคนที่เชื่อถือได้ในขณะที่จะได้รับการสืบค้นหลัง/lib/usr/lib ดังนั้นคำสั่งที่ld.soค้นหาพา ธ สำหรับห้องสมุดมีอะไรบ้าง ทำไม/libสืบค้นก่อน/usr/lib? ถ้ามันไม่ได้แล้วทำไมเป็นไดเรกทอรีเพิ่มเติมสืบค้นหลัง/lib?

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