Xác định các phụ thuộc đối tượng được chia sẻ trực tiếp của nhị phân Linux?


169

Làm thế nào tôi có thể dễ dàng tìm ra các phụ thuộc đối tượng được chia sẻ trực tiếp của tệp nhị phân Linux ở định dạng ELF?

Tôi biết về công cụ ldd, nhưng dường như xuất ra tất cả các phụ thuộc của nhị phân, bao gồm cả các phụ thuộc của bất kỳ đối tượng chia sẻ nào mà nhị phân phụ thuộc vào.


Câu trả lời:


261

Bạn có thể sử dụng readelfđể khám phá các tiêu đề ELF. readelf -dsẽ liệt kê các phụ thuộc trực tiếp như NEEDEDcác phần.

 $ 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
 ...

20
Điều đó thật tuyệt. Không giống như ldd, readelf có thể kiểm tra nhị phân đa nền tảng (nghĩa là kiểm tra một tệp thực thi ARM từ x86-64 linux.)
Robert Calhoun

86

Nếu bạn muốn tìm các phụ thuộc theo cách đệ quy (bao gồm cả các phụ thuộc của các phụ thuộc, các phụ thuộc của các phụ thuộc và vv)

Bạn có thể sử dụng lddlệnh. ldd - in phụ thuộc thư viện chia sẻ


5
Lệnh ldd hoạt động phụ thuộc vào các phụ thuộc, đó không phải là điều tôi muốn.
Wildebeest miễn phí

11
Đối với tôi điều này hoạt động tốt. Và nó thậm chí còn cho bạn biết, thư viện nào có thể và không thể tìm thấy.
Philipp F

2
ldd sẽ không hoạt động với một tệp thực thi - chỉ để tìm ra sự phụ thuộc của các thư viện dùng chung, nó rất hữu ích.
Tuxdude

2
Tuxdude, tại sao bạn nghĩ như vậy? Lý do không thể sử dụng của ldd đối với các tệp thực thi ELF là gì?
Vitaly Isaev

Điều này thật tuyệt vời cho copiyng yêu cầu chia sẻ lib từ máy phát triển đến kho lưu trữ triển khai.
Tomáš Zato - Phục hồi Monica

30

Công objdumpcụ có thể cho bạn biết thông tin này. Nếu bạn gọi objdumpvới -xtùy chọn, để đưa nó ra đầu ra tất cả các tiêu đề thì bạn sẽ tìm thấy các phụ thuộc đối tượng được chia sẻ ngay khi bắt đầu trong "Phần động".

Ví dụ: chạy objdump -x /usr/lib/libXpm.so.4trên hệ thống của tôi cung cấp thông tin sau trong "Phần động":

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

Các phụ thuộc đối tượng được chia sẻ trực tiếp được liệt kê dưới dạng các giá trị 'CẦN THIẾT'. Vì vậy, trong ví dụ trên, libXpm.so.4trên hệ thống của tôi chỉ cần libX11.so.6libc.so.6.

Điều quan trọng cần lưu ý là điều này không có nghĩa là tất cả các biểu tượng cần thiết của nhị phân được truyền vào objdumpsẽ có mặt trong các thư viện, nhưng ít nhất nó cũng hiển thị những thư viện nào trình tải sẽ cố tải khi tải nhị phân.


13

ldd -v in cây phụ thuộc trong phần "Thông tin phiên bản: '. Khối đầu tiên trong phần đó là các phụ thuộc trực tiếp của nhị phân.

Xem ldd phân cấp (1)


Sự khác biệt giữa cái này và objdump -x <binary> | grep "NEEDED"cái gì? Ý tôi là, cả hai gần như giống hệt nhau, tôi chỉ nhận được một .sotệp nhiều lddhơn objdump. Nhưng thực tế kết quả không giống nhau khiến tôi tự hỏi phương pháp nào chính xác hơn.
m4l490n
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.