GNU/Linux >> Belajar Linux >  >> Linux

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

  1. 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 , di dl_main fungsi.

    Namun perhatikan bahwa ld.so tidak memiliki ketergantungan eksternal. Anda dapat melihat simbol yang terlibat dengan nm -D; tidak satu pun dari mereka yang tidak ditentukan.

  2. Halaman manual hanya mengacu pada entri langsung di bawah /lib , yaitu /lib/ld.so (linker dinamis libc 5, yang mendukung a.out ) dan /lib*/ld-linux*.so* (linker dinamis libc 6, yang mendukung ELF). Halaman manualnya sangat spesifik, dan ld.so bukan ld-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 ).


Linux
  1. Apa yang Dirujuk oleh Penerjemah yang Dilaporkan Oleh `file`?

  2. Bagaimana cara menemukan versi Fedora yang saya gunakan?

  3. Dalam penangan SIGILL, bagaimana saya bisa melewatkan instruksi yang menyinggung?

  1. Bagaimana saya bisa mengeksekusi kode PHP dari baris perintah?

  2. Bagaimana saya bisa melihat ukuran file dan direktori di linux?

  3. Bagaimana saya bisa mendapatkan informasi wadah Docker Linux dari dalam wadah itu sendiri?

  1. Bagaimana saya bisa menginstal Anaconda terbaru dengan wget

  2. Bagaimana saya bisa menyembunyikan Bilah Alat di Emacs secara terus-menerus?

  3. Bagaimana saya bisa memantau panjang antrian penerimaan?