-
Ya, itu menautkan dirinya sendiri saat diinisialisasi. Secara teknis linker dinamis tidak memerlukan resolusi dan relokasi objek untuk dirinya sendiri, karena sepenuhnya diselesaikan apa adanya, tetapi ia menentukan simbol dan harus menjaganya saat menyelesaikan biner yang "diinterpretasikan", dan simbol tersebut diperbarui untuk menunjukkan implementasinya di pustaka yang dimuat. Secara khusus, ini mempengaruhi
malloc
— linker memiliki versi minimal built-in, dengan simbol yang sesuai, tetapi itu digantikan oleh versi pustaka C setelah dimuat dan dipindahkan (atau bahkan dengan versi sela jika ada), dengan beberapa kehati-hatian untuk memastikan ini tidak tidak terjadi pada titik yang dapat merusak linker.Detail mengerikan ada di
rtld.c
, didl_main
fungsi.Namun perhatikan bahwa
ld.so
tidak memiliki ketergantungan eksternal. Anda dapat melihat simbol yang terlibat dengannm -D
; tidak satu pun dari mereka yang tidak ditentukan. -
Halaman manual hanya mengacu pada entri langsung di bawah
/lib
, yaitu/lib/ld.so
(linker dinamis libc 5, yang mendukunga.out
) dan/lib*/ld-linux*.so*
(linker dinamis libc 6, yang mendukung ELF). Halaman manualnya sangat spesifik, danld.so
bukanld-2.28.so
.Penaut dinamis yang ditemukan di sebagian besar sistem saat ini tidak menyertakan
a.out
dukungan.
file
dan ldd
melaporkan hal yang berbeda untuk penghubung dinamis karena mereka memiliki definisi berbeda tentang apa yang merupakan biner yang terhubung secara statis. Untuk ldd
, sebuah biner ditautkan secara statis jika tidak memiliki DT_NEEDED
simbol, yaitu tidak ada simbol yang tidak terdefinisi. Untuk file
, biner ELF ditautkan secara statis jika tidak memiliki PT_DYNAMIC
bagian (ini akan berubah dalam rilis file
mengikuti 5.37; sekarang menggunakan keberadaan PT_INTERP
bagian sebagai indikator biner yang ditautkan secara dinamis, yang cocok dengan komentar dalam kode).
Penaut dinamis perpustakaan GNU C tidak memiliki DT_NEEDED
simbol, tetapi memiliki PT_DYNAMIC
bagian (karena secara teknis merupakan perpustakaan bersama). Hasilnya, ldd
(yang merupakan linker dinamis) menunjukkan bahwa itu tertaut secara statis, tetapi file
menunjukkan bahwa itu terhubung secara dinamis. Itu tidak memiliki PT_INTERP
bagian, jadi rilis berikutnya dari file
juga akan menunjukkan bahwa itu ditautkan 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 file
5.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 file
yang saat ini sedang dikembangkan ).