Menentukan ketergantungan objek langsung bersama dari biner Linux?

170

Bagaimana saya bisa dengan mudah mengetahui dependensi objek bersama langsung dari biner Linux dalam format ELF?

Saya mengetahui alat ldd, tetapi yang muncul untuk menampilkan semua dependensi dari biner, termasuk dependensi dari setiap objek bersama yang bergantung pada biner.

Wildebeest gratis
sumber
2
related unix.stackexchange.com/questions/120015/…
Ciro Santilli 郝海东 冠状 病 六四 六四 事件

Jawaban:

262

Anda dapat menggunakan readelfuntuk menjelajahi header ELF. readelf -dakan mencantumkan dependensi langsung sebagai NEEDEDbagian.

 $ readelf -d elfbin

Dynamic section at offset 0xe30 contains 22 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.0.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x400520
 0x000000000000000d (FINI)               0x400758
 ...
Tikar
sumber
20
Ini bagus. Tidak seperti ldd, readelf dapat memeriksa binary lintas-platform (mis. Memeriksa ARM yang dapat dieksekusi dari x86-64 linux.)
Robert Calhoun
86

Jika Anda ingin menemukan dependensi secara rekursif (termasuk dependensi dependensi, dependensi dependensi dependensi, dan sebagainya) ...

Anda dapat menggunakan lddperintah. ldd - mencetak dependensi pustaka bersama

Serge C
sumber
5
Perintah ldd menghitung dependensi dependensi, yang bukan yang saya inginkan.
Wildebeest Gratis
11
Bagi saya ini berfungsi dengan baik. Dan itu bahkan memberitahu Anda, perpustakaan mana yang bisa dan tidak dapat ditemukan.
Philipp F
2
ldd tidak akan berfungsi dengan executable - hanya untuk mengetahui dependensi dari shared library, itu berguna.
Tuxdude
2
Tuxdude, mengapa menurut Anda begitu? Apa alasan ketidaklayakan LDL untuk executable ELF?
Vitaly Isaev
Ini luar biasa untuk copiyng diperlukan shared libs dari mesin pengembangan ke deployment arsip.
Tomáš Zato - Reinstate Monica
30

The objdumpalat dapat memberitahu Anda informasi ini. Jika Anda memohon objdumpdengan -xopsi, untuk membuatnya mengeluarkan semua tajuk maka Anda akan menemukan dependensi objek bersama tepat di awal di "Bagian Dinamis".

Misalnya berjalan objdump -x /usr/lib/libXpm.so.4di sistem saya memberikan informasi berikut di "Bagian Dinamis":

Dynamic Section:
  NEEDED               libX11.so.6
  NEEDED               libc.so.6
  SONAME               libXpm.so.4
  INIT                 0x0000000000002450
  FINI                 0x000000000000e0e8
  GNU_HASH             0x00000000000001f0
  STRTAB               0x00000000000011a8
  SYMTAB               0x0000000000000470
  STRSZ                0x0000000000000813
  SYMENT               0x0000000000000018
  PLTGOT               0x000000000020ffe8
  PLTRELSZ             0x00000000000005e8
  PLTREL               0x0000000000000007
  JMPREL               0x0000000000001e68
  RELA                 0x0000000000001b38
  RELASZ               0x0000000000000330
  RELAENT              0x0000000000000018
  VERNEED              0x0000000000001ad8
  VERNEEDNUM           0x0000000000000001
  VERSYM               0x00000000000019bc
  RELACOUNT            0x000000000000001b

Ketergantungan objek yang dibagikan langsung terdaftar sebagai nilai 'DIPERLUKAN'. Jadi pada contoh di atas, libXpm.so.4pada sistem saya hanya perlu libX11.so.6dan libc.so.6.

Penting untuk dicatat bahwa ini tidak berarti bahwa semua simbol yang diperlukan oleh biner yang dilewati objdumpakan ada di perpustakaan, tetapi setidaknya menunjukkan perpustakaan apa yang akan dicoba dimuat oleh loader ketika memuat biner.

Wildebeest gratis
sumber
13

ldd -v mencetak pohon dependensi di bawah bagian "Informasi Versi: '. Blok pertama di bagian itu adalah dependensi langsung dari biner.

Lihat Hierarchical ldd (1)

Hannes
sumber
Apa perbedaan antara ini dan objdump -x <binary> | grep "NEEDED"? Maksud saya, keduanya hampir persis sama, saya hanya mendapatkan satu .sofile lebih banyak ldddaripada objdump. Tetapi kenyataannya hasilnya tidak sama membuat saya bertanya-tanya metode mana yang lebih akurat.
m4l490n