Bagaimana tautan dinamis / loader itu sendiri secara dinamis ditautkan seperti yang dilaporkan oleh `file`?

12

Pertimbangkan dependensi objek yang dibagikan /bin/bash, yang termasuk /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)

Memeriksa /lib64/ld-linux-x86-64.so.2menunjukkan bahwa itu adalah symlink ke /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

Selanjutnya, filelaporan /lib/x86_64-linux-gnu/ld-2.28.soitu sendiri terhubung secara dinamis:

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

Saya ingin tahu:

  1. Bagaimana linker / loader ( /lib64/ld-linux-x86-64.so.2) itu sendiri dapat dihubungkan secara dinamis? Apakah tautan itu sendiri saat runtime?
  2. /lib/x86_64-linux-gnu/ld-2.28.sodidokumentasikan untuk menangani binari a.out ( man ld.so), tetapi /bin/bashapakah ELF dapat dieksekusi?

Program ld.so menangani a.out binari, format yang digunakan sejak lama; ld-linux.so * (/lib/ld-linux.so.1 untuk libc5, /lib/ld-linux.so.2 untuk glibc2) menangani ELF, yang telah digunakan semua orang selama bertahun-tahun sekarang.

Shuzheng
sumber
Kernel tidak peduli dengan seluk beluk taksonomi yang halus (dan begitu juga Anda ;-)). Kernel hanya membuat perbedaan antara ELF yang membutuhkan penerjemah dan yang tidak. Dan AFAIK, Anda tidak dapat menggunakan penerjemah yang membutuhkannya.
Mosvy
@StephenKitt punyaku belum ( /lib/x86_64-linux-gnu/ld-2.28.so, debian 10 buster)
mosvy
@ Mosvy ya, maaf, saya campur aduk antara filekomentar keliru tentang bagaimana ia mendefinisikan biner statis, dan kenyataan ld-2.28.so... Pembeda adalah PT_DYNAMIC.
Stephen Kitt

Jawaban:

17
  1. Ya, itu menautkan dirinya sendiri ketika diinisialisasi. Secara teknis linker dinamis tidak memerlukan resolusi objek dan relokasi untuk dirinya sendiri, karena sepenuhnya diselesaikan apa adanya, tetapi tidak mendefinisikan simbol dan harus mengurus mereka ketika menyelesaikan biner itu "menafsirkan", dan simbol-simbol tersebut diperbarui untuk menunjuk implementasi mereka di perpustakaan yang dimuat. Secara khusus, ini mempengaruhi malloc- linker memiliki versi minimal built-in, dengan simbol yang sesuai, tetapi itu digantikan oleh versi C library setelah dimuat dan dipindahkan (atau bahkan oleh versi selingan jika ada), dengan hati-hati diambil untuk memastikan ini tidak terjadi pada titik di mana itu dapat merusak tautan.

    Detail darah ada di rtld.c, dalam dl_mainfungsi.

    Namun perlu dicatat bahwa ld.sotidak memiliki dependensi eksternal. Anda dapat melihat simbol yang terlibat nm -D; tidak satupun dari mereka yang tidak terdefinisi.

  2. Halaman manual hanya merujuk pada entri langsung di bawah /lib, yaitu /lib/ld.so (libc 5 dynamic linker, yang mendukung a.out) dan /lib*/ld-linux*.so*(the libc 6 dynamic linker, yang mendukung ELF). Halaman manualnya sangat spesifik, dan ld.sotidak ld-2.28.so.

    Linker dinamis yang ditemukan di sebagian besar sistem saat ini tidak termasuk a.outdukungan.

filedan lddmelaporkan hal-hal berbeda untuk penghubung dinamis karena mereka memiliki definisi berbeda tentang apa yang merupakan biner yang terhubung secara statis. Sebab ldd, biner terkait secara statis jika tidak memiliki DT_NEEDEDsimbol, yaitu tidak ada simbol yang tidak terdefinisi. Sebab file, biner ELF terhubung secara statis jika tidak memiliki PT_DYNAMICbagian (ini akan berubah pada rilis file5.37 berikut; sekarang menggunakan kehadiran PT_INTERPbagian sebagai indikator biner yang terhubung secara dinamis, yang cocok dengan komentar di Kode).

Penghubung dinamis pustaka GNU C tidak memiliki DT_NEEDEDsimbol apa pun , tetapi memiliki PT_DYNAMICbagian (karena secara teknis pustaka bersama). Akibatnya, ldd(yang merupakan penghubung dinamis) menunjukkan bahwa itu terhubung secara statis, tetapi filemenunjukkan bahwa itu terhubung secara dinamis. Itu tidak memiliki PT_INTERPbagian, jadi rilis berikutnya filejuga akan menunjukkan bahwa itu terhubung secara statis.

$ 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

(dengan 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

(dengan versi yang saat ini dalam pengembangan file).

Stephen Kitt
sumber
Mengapa kata "menafsirkan" digunakan dalam konteks tautan dinamis? Kata itu biasanya digunakan dalam konteks bahasa pemrograman.
Shuzheng
Apa yang Anda maksud dengan "GNU C library dynamic linker"? Apakah Anda merujuk /lib*/ld-linux*.so*, atau penghubung dinamis ketiga?
Shuzheng
Di mana Anda dapat melihat lddlaporan tautan dinamis sebagai tautan statis? Karena itu daftar dependensi objek bersama kosong?
Shuzheng
Program yang terhubung secara dinamis membutuhkan beberapa pekerjaan yang dilakukan sebelum dapat dijalankan; pekerjaan itu dilakukan oleh penghubung dinamis, yang pada akhirnya memainkan peran yang serupa dengan seorang juru bahasa - ia mengartikan tabel relokasi dll untuk menghasilkan sesuatu yang dapat dijalankan oleh komputer.
Stephen Kitt
Ketika saya mengatakan "GNU C library dynamic linker", saya merujuk pada implementasi yang termasuk dalam perpustakaan GNU C, biasanya dikirimkan sebagai /lib*/ld-linux*.so*. Saya menentukan asal dari tautan dinamis karena ada implementasi lain yang tersedia untuk Linux.
Stephen Kitt
0
  1. Saya menduga fileprogram salah tentang penghubung / pemuat dinamis yang terhubung secara dinamis. The lddProgram tidak setuju. Setidaknya tidak di sistem saya (Debian Stretch):

    ldd /lib/x86_64-linux-gnu/ld-2.24.so
        statically linked
    
  2. man ld.sojuga berbunyi: "ld-linux.so * menangani ELF" . Pada sistem Anda (dan milik saya juga) keduanya adalah symlink ke biner yang sama yang saya simpulkan mampu menangani ELF dan format a.out (lama usang).

Hkoof
sumber
informasi apa yang Anda tambahkan ke jawaban yang diterima?
miracle173
2
@ miracle173 jawaban ini lebih tua dari jawaban yang diterima ;-).
Stephen Kitt
kamu benar. Saya melewatkan ini. Saya pikir pertanyaan dan jawaban yang diterima sudah sangat tua dan jawaban ini diposting dalam jam terakhir. Saya tidak dapat membatalkan downvote saya sampai seseorang mengubah posting.
miracle173