ตัวเชื่อมโยง / ตัวโหลดเดอร์แบบไดนามิกสามารถลิงก์แบบไดนามิกตามที่รายงานโดย `ไฟล์ 'ได้อย่างไร


12

พิจารณาการพึ่งพาวัตถุที่ใช้ร่วมกัน/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, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

ฉันอยากรู้:

  1. ตัวเชื่อมโยง / ตัวโหลดเดอร์ ( /lib64/ld-linux-x86-64.so.2) แบบไดนามิกสามารถเชื่อมโยงแบบไดนามิกได้อย่างไร มันเชื่อมโยงตัวเองที่รันไทม์?
  2. /lib/x86_64-linux-gnu/ld-2.28.soมีการบันทึกไว้เพื่อจัดการกับ a.out binaries ( man ld.so) แต่/bin/bashสามารถใช้งาน ELF ได้หรือไม่

โปรแกรม ld.so จัดการไบนารี a.out ซึ่งเป็นรูปแบบที่ใช้มานานแล้ว ld-linux.so * (/lib/ld-linux.so.1 สำหรับ libc5, /lib/ld-linux.so.2 สำหรับ glibc2) han‐ dles ELF ซึ่งทุกคนใช้มานานหลายปีแล้ว


เคอร์เนลไม่สนใจเกี่ยวกับ subtleties อนุกรมวิธานย่อย ๆ (และคุณควร ;-)) เคอร์เนลสร้างความแตกต่างระหว่างเอลฟ์ที่ต้องการล่ามและที่ไม่ต้องการเท่านั้น และ AFAIK คุณไม่สามารถใช้ล่ามที่ต้องการได้
mosvy

@StephenKitt mine ยังไม่ได้ ( /lib/x86_64-linux-gnu/ld-2.28.so, debian 10 buster)
mosvy

@mosvy ใช่ขอโทษผมได้ผสมขึ้นระหว่างfile's ความคิดเห็นที่ผิดพลาดเกี่ยวกับวิธีการกำหนดไบนารีคงที่และความเป็นจริงของld-2.28.so... PT_DYNAMICความแตกต่างคือ
Stephen Kitt

คำตอบ:


17
  1. ใช่มันเชื่อมโยงตัวเองเมื่อเริ่มต้น เทคนิค linker แบบไดนามิกไม่จำเป็นต้องมีความละเอียดของวัตถุและการย้ายสำหรับตัวเองเนื่องจากมันได้รับการแก้ไขอย่างเต็มที่ตามที่เป็น แต่มันจะกำหนดสัญลักษณ์และจะต้องดูแลพวกเขาเมื่อแก้ไขไบนารีมัน "ตีความ" และสัญลักษณ์เหล่านั้นได้รับการปรับปรุง เพื่อชี้ไปที่การประยุกต์ใช้งานในไลบรารีที่โหลด โดยเฉพาะอย่างยิ่งสิ่งนี้มีผลต่อmalloc- ตัวเชื่อมโยงมีเวอร์ชันในตัวน้อยที่สุดพร้อมด้วยสัญลักษณ์ที่เกี่ยวข้อง แต่จะถูกแทนที่ด้วยเวอร์ชัน C ของไลบรารีเมื่อโหลดและย้ายที่ใหม่แล้ว (หรือแม้กระทั่งรุ่นที่มี interposed ถ้ามี) ด้วยความระมัดระวัง ดำเนินการเพื่อให้แน่ใจว่าสิ่งนี้จะไม่เกิดขึ้น ณ จุดที่อาจทำให้ตัวเชื่อม

    รายละเอียดเต็มไปด้วยเลือดอยู่ในrtld.cในdl_mainฟังก์ชั่น

    อย่างไรก็ตามโปรดทราบว่าld.soไม่มีการอ้างอิงภายนอก คุณสามารถดูสัญลักษณ์ที่เกี่ยวข้องกับnm -D; ไม่มีสิ่งใดที่ไม่ได้กำหนด

  2. manpage เพียง แต่หมายถึงรายการโดยตรงภายใต้/lib, IE /lib/ld.so (คน libc ลิงเกอร์ 5 แบบไดนามิกซึ่งสนับสนุนa.out) และ/lib*/ld-linux*.so*(คน libc 6 แบบไดนามิกลิงเกอร์ซึ่งสนับสนุนเอลฟ์) manpage เป็นมากที่เฉพาะเจาะจงและไม่ได้เป็นld.sold-2.28.so

    ตัวเชื่อมโยงแบบไดนามิกที่พบในระบบปัจจุบันส่วนใหญ่ไม่ได้รวมa.outการสนับสนุน

fileและlddรายงานสิ่งต่าง ๆ สำหรับตัวเชื่อมโยงแบบไดนามิกเพราะพวกเขามีคำจำกัดความที่แตกต่างกันของสิ่งที่ถือเป็นไบนารีที่เชื่อมโยงแบบคงที่ สำหรับlddไบนารีนั้นถูกเชื่อมโยงแบบสแตติกหากไม่มีDT_NEEDEDสัญลักษณ์นั่นคือไม่มีสัญลักษณ์ที่ไม่ได้กำหนด สำหรับfileไบนารี ELF นั้นถูกเชื่อมโยงแบบสแตติกหากไม่มีPT_DYNAMICส่วน (สิ่งนี้จะเปลี่ยนแปลงในการเปิดตัวของfile5.37 ต่อไปนี้ตอนนี้จะใช้การแสดงตนของPT_INTERPส่วนเป็นตัวบ่งชี้ของไบนารีที่เชื่อมโยงแบบไดนามิกซึ่งตรงกับความคิดเห็นใน รหัส).

ตัวลิงก์ไดนามิกไลบรารี GNU C ไม่มีDT_NEEDEDสัญลักษณ์ใด ๆแต่มีPT_DYNAMICส่วน (เนื่องจากเป็นไลบรารีที่แบ่งใช้ทางเทคนิค) เป็นผลให้ldd(ซึ่งเป็นตัวเชื่อมโยงแบบไดนามิก) บ่งชี้ว่ามันถูกเชื่อมโยงแบบคงที่ แต่fileระบุว่ามันมีการเชื่อมโยงแบบไดนามิก ไม่มีPT_INTERPส่วนดังนั้นรุ่นถัดไปของfileจะระบุว่ามีการเชื่อมโยงแบบคงที่

$ ldd /lib64/ld-linux-x86-64.so.2
        statically linked

$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

(กับfile5.35)

$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

(ด้วยเวอร์ชันปัจจุบันที่กำลังพัฒนาfile)


เหตุใดจึงใช้คำว่า "การตีความ" ในบริบทของการเชื่อมโยงแบบไดนามิก คำนั้นมักใช้ในบริบทของการวางโปรแกรมภาษา
Shuzheng

คุณหมายถึงอะไรโดย "GNU C dynamic dynamic linker"? คุณหมายถึง/lib*/ld-linux*.so*หรือ linker แบบไดนามิกที่สาม?
Shuzheng

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

โปรแกรมที่เชื่อมโยงแบบไดนามิกต้องการงานที่ทำก่อนที่จะสามารถดำเนินการได้ งานนั้นทำโดยตัวเชื่อมโยงแบบไดนามิกซึ่งจบลงด้วยการมีบทบาทคล้ายกับล่าม - มันตีความตารางการย้ายตำแหน่ง ฯลฯ เพื่อสร้างบางสิ่งที่คอมพิวเตอร์สามารถทำงานได้
Stephen Kitt

เมื่อผมบอกว่า“GNU C ห้องสมุดแบบไดนามิกลิงเกอร์” ผมหมายถึงการดำเนินงานที่รวมอยู่ในห้องสมุด GNU C, /lib*/ld-linux*.so*มักจะจัดส่งเป็น ฉันระบุที่มาของตัวเชื่อมโยงแบบไดนามิกเพราะมีการใช้งานอื่น ๆ สำหรับ Linux
Stephen Kitt

0
  1. ฉันสงสัยว่าfileโปรแกรมนั้นผิดเกี่ยวกับตัวเชื่อมโยง / ตัวโหลดแบบไดนามิกที่เชื่อมโยงตัวเองแบบไดนามิก lddโปรแกรมไม่เห็นด้วย อย่างน้อยไม่ได้อยู่ในระบบของฉัน (Debian Stretch):

    ldd /lib/x86_64-linux-gnu/ld-2.24.so
        statically linked
    
  2. man ld.soยังอ่าน: "ld-linux.so * จับเอลฟ์" ในระบบของคุณ (และของฉันด้วย) ทั้งคู่เป็น symlink ไปยังไบนารีเดียวกันซึ่งฉันอนุมานสามารถจัดการทั้งเอลฟ์และรูปแบบ a.out (เก่าล้าสมัย)


คุณเพิ่มข้อมูลใดลงในคำตอบที่ยอมรับได้
miracle173

2
@ miracle173 คำตอบนี้เก่ากว่าคำตอบที่ยอมรับ ;-)
Stephen Kitt

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