Có phải một tệp được báo cáo là không phải là một tệp thực thi động bởi 'ldd' phụ thuộc vào các thư viện khác không?


9

Chỉ cần chắc chắn rằng tôi đã làm đúng - tôi gọi

ldd /path/to/executable

và nó trả về "không phải là một thực thi động". Điều này có nghĩa là nó không phụ thuộc vào các thư viện khác, đúng không? Nếu vậy, điều đó có nghĩa là nó có thể được chuyển sang một hộp Ubuntu khác mà không phải lo lắng về sự phụ thuộc?

Câu trả lời:


3

Đúng, nhưng có một cái gì đó để tính đến.

Từ lddtrang hướng dẫn:

ldd không hoạt động trên các thư viện chia sẻ a.out.

ldd không hoạt động với một số chương trình a.out cực kỳ cũ được xây dựng trước khi hỗ trợ ldd được thêm vào các bản phát hành trình biên dịch. Nếu bạn sử dụng ldd trên một trong những chương trình này, chương trình sẽ cố chạy với argc = 0 và kết quả sẽ không thể đoán trước.


3
Một lý do khác có thể là nhị phân được xây dựng cho hệ thống 32 bit nhưng bạn đang kiểm tra nó trên hệ thống 64 bit.
Ferdinand Prantl

@FerdinandPrantl Nếu được xây dựng trong 32 bit, lddvẫn in các phụ thuộc 32 bit.
Calmarius

@Calmarius không đúng, khi bạn không có libgcc1 32 bit cơ bản. Chỉ cần xác minh trên bản cài đặt Ubuntu Server mới: Bạn cần cài đặt libgcc1: i386 để làm cho ldd hài ​​lòng cho các tệp nhị phân 32 bit.
chim ưng

1

@Calmarius là chính xác, điều này xảy ra nếu bạn xem xét exe 32 bit, thậm chí không có thư viện 32 bit cơ bản.

Tôi đang cố gắng nâng cấp hệ thống của mình (bản cài đặt mới Ubuntu 16.04, từ ngày 12.04), tôi phải cài đặt dịch vụ 32 bit propitiatory cũ avserver, yêu cầu ia32-libs(không còn khả dụng). Điều này có nghĩa là cả hai dpkgapt-getkhông hài lòng (bất cứ điều gì tôi làm, nó sẽ nhắc tôi apt-get -f installvà nếu tôi chạy nó, nó khăng khăng tôi gỡ cài đặt gói dịch vụ) và dịch vụ của tôi sẽ không bắt đầu.

Để chứng minh rằng điều này không còn thiếu các thư viện 32 bit, tôi đã gắn hệ thống cũ của mình (Ubuntu 12.04, ia32-libsvà các thư viện 32 bit) /sda2. Đảm bảo /opt(chứa nhị phân 32 bit của tôi) được gắn vào /sda2/opt, tôi có thể chroot /sda2lddsau đó chạy như dự định.

Để khắc phục điều này, tôi có thể đã cài đặt thủ công tất cả các gói thư viện phụ thuộc với: i386 (arch). Tuy nhiên, tôi quyết định thay vì cố gắng tìm ra sự phụ thuộc của mình là gì, tôi đã cài đặt rượu vang (phần lớn là 32 bit, và vì vậy cài đặt các thư viện cơ bản và tải thêm mà tôi không thực sự cần, nhưng tôi ổn với điều đó).

Để khắc phục dpkgapt-get, tôi đã chỉnh sửa /var/lib/dpkg/status, tìm gói cho dịch vụ của mình và xóa ia32-libs. Bây giờ dpkgapt-getđang hạnh phúc

Thế là xong, lddvui vẻ báo cáo: - root@withnail:/opt/<service path># ldd avserver linux-gate.so.1 => (0xf77a6000) libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf778f000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7772000) libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xf776b000) libresolv.so.2 => /lib/i386-linux-gnu/libresolv.so.2 (0xf7752000) libcrypt.so.1 => /lib/i386-linux-gnu/libcrypt.so.1 (0xf7720000) libktssl.so.1.0.0 => /opt/<service path>/libktssl.so.1.0.0 (0xf76cb000) libktcrypto.so.1.0.0 => /opt/<service path>/libktcrypto.so.1.0.0 (0xf756b000) libktz.so.1 => /opt/<service path>/libktz.so.1 (0xf7558000) librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf754f000) libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf73d8000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7383000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7366000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf71af000) /lib/ld-linux.so.2 (0x565b1000)


Cài đặt rượu vang là một mẹo rất thông minh để có được tất cả các thư viện 32 bit bạn cần !!
psitae
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.