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.2
menunjukkan 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, file
laporan /lib/x86_64-linux-gnu/ld-2.28.so
itu 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:
- Bagaimana linker / loader (
/lib64/ld-linux-x86-64.so.2
) itu sendiri dapat dihubungkan secara dinamis? Apakah tautan itu sendiri saat runtime? /lib/x86_64-linux-gnu/ld-2.28.so
didokumentasikan untuk menangani binari a.out (man ld.so
), tetapi/bin/bash
apakah 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.
linux
dynamic-linking
shared-library
file-command
Shuzheng
sumber
sumber
/lib/x86_64-linux-gnu/ld-2.28.so
, debian 10 buster)file
komentar keliru tentang bagaimana ia mendefinisikan biner statis, dan kenyataanld-2.28.so
... Pembeda adalahPT_DYNAMIC
.Jawaban:
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
, dalamdl_main
fungsi.Namun perlu dicatat bahwa
ld.so
tidak memiliki dependensi eksternal. Anda dapat melihat simbol yang terlibatnm -D
; tidak satupun dari mereka yang tidak terdefinisi.Halaman manual hanya merujuk pada entri langsung di bawah
/lib
, yaitu/lib/ld.so
(libc 5 dynamic linker, yang mendukunga.out
) dan/lib*/ld-linux*.so*
(the libc 6 dynamic linker, yang mendukung ELF). Halaman manualnya sangat spesifik, danld.so
tidakld-2.28.so
.Linker dinamis yang ditemukan di sebagian besar sistem saat ini tidak termasuk
a.out
dukungan.file
danldd
melaporkan hal-hal berbeda untuk penghubung dinamis karena mereka memiliki definisi berbeda tentang apa yang merupakan biner yang terhubung secara statis. Sebabldd
, biner terkait secara statis jika tidak memilikiDT_NEEDED
simbol, yaitu tidak ada simbol yang tidak terdefinisi. Sebabfile
, biner ELF terhubung secara statis jika tidak memilikiPT_DYNAMIC
bagian (ini akan berubah pada rilisfile
5.37 berikut; sekarang menggunakan kehadiranPT_INTERP
bagian sebagai indikator biner yang terhubung secara dinamis, yang cocok dengan komentar di Kode).Penghubung dinamis pustaka GNU C tidak memiliki
DT_NEEDED
simbol apa pun , tetapi memilikiPT_DYNAMIC
bagian (karena secara teknis pustaka bersama). Akibatnya,ldd
(yang merupakan penghubung dinamis) menunjukkan bahwa itu terhubung secara statis, tetapifile
menunjukkan bahwa itu terhubung secara dinamis. Itu tidak memilikiPT_INTERP
bagian, jadi rilis berikutnyafile
juga akan menunjukkan bahwa itu terhubung secara statis.(dengan
file
5.35)(dengan versi yang saat ini dalam pengembangan
file
).sumber
/lib*/ld-linux*.so*
, atau penghubung dinamis ketiga?ldd
laporan tautan dinamis sebagai tautan statis? Karena itu daftar dependensi objek bersama kosong?/lib*/ld-linux*.so*
. Saya menentukan asal dari tautan dinamis karena ada implementasi lain yang tersedia untuk Linux.Saya menduga
file
program salah tentang penghubung / pemuat dinamis yang terhubung secara dinamis. Theldd
Program tidak setuju. Setidaknya tidak di sistem saya (Debian Stretch):man ld.so
juga 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).sumber