Tìm hiểu xem thư viện có trong đường dẫn không


13

Giả sử tôi muốn kiểm tra nếu một thư viện được cài đặt và có thể sử dụng được bởi một chương trình. Tôi có thể sử dụng ldconfig -p | grep mylibđể tìm hiểu nếu nó được cài đặt trên hệ thống. Nhưng nếu thư viện chỉ được biết thông qua cài đặt LD_LIBRARY_PATHthì sao?

Trong trường hợp đó, chương trình có thể tìm thấy thư viện, nhưng ldconfigsẽ không. Làm cách nào để kiểm tra xem thư viện có nằm trong đường dẫn liên kết kết hợp không?

Tôi sẽ nói thêm rằng tôi đang tìm kiếm một giải pháp sẽ hoạt động ngay cả khi tôi không thực sự có chương trình trong tay (ví dụ: chương trình chưa được biên dịch), tôi chỉ muốn biết rằng một thư viện nào đó tồn tại trong ld' đường dẫn s.


2
Bạn có thể sử dụng ldd <binary>để kiểm tra xem tất cả các thư viện được liên kết có trong đường dẫn không. Có lẽ có một cách thanh lịch hơn.
Thomas

@Thomas Tôi nghĩ bạn nên đưa ra câu trả lời cho nhận xét của mình. lddphục vụ chính xác mục đích này.
lgeorget

1
@Thomas - nhưng nếu chương trình tôi chưa được biên dịch và thư viện đó là cần thiết để biên dịch thì sao?
nbubis

@Igeorget - xem chỉnh sửa của tôi / nhận xét
nbubis

@nbubis: khi bạn cần thư viện để biên dịch, thông thường bạn phải sử dụng LIBRARY_PATHbiến môi trường được tìm kiếm, ví dụ như gcctrình biên dịch. Biến LIBRARY_PATHmôi trường cũng có một danh sách các thư mục riêng biệt.
Thomas

Câu trả lời:


14

ldconfig có thể liệt kê tất cả các thư viện mà nó có quyền truy cập. Các thư viện này cũng được lưu trữ trong bộ đệm của nó.

/sbin/ldconfig -v -Nsẽ thu thập dữ liệu tất cả các đường dẫn thư viện thông thường, liệt kê tất cả các thư viện có sẵn mà không cần xây dựng lại bộ đệm (điều này là không thể nếu bạn là người dùng không phải root). Nó KHÔNG đưa vào các thư viện tài khoản trong LD_LIBRARY_PATH (trái với những gì bài đăng này đã nói trước khi chỉnh sửa) nhưng bạn có thể chuyển các thư viện bổ sung vào dòng lệnh bằng cách sử dụng dòng dưới đây:

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

ldconfig là một công cụ từ những năm 1980 đã được từ bỏ vào những năm 1990. Vì lý do này, ldconfigkhông thể mang theo được vì nó chỉ áp dụng cho các triển khai dựa trên a.outtrình liên kết động dựa trên SunOS-4.0 từ năm 1987.
schily

Làm thế nào để giúp liệt kê các lib chỉ có trên LD_LIBRARY_PATH? Tôi đoán rằng tôi có thể viết một kịch bản để phân tích điều đó và sau đó đọc nó thông qua ldconfig, nhưng nó có vẻ hơi giống như một sự giết chóc.
nbubis

1
@nbubis bạn luôn có thể chuyển các thư viện trong LD_LIBRARY_PATH sang ldconfig. Giống như /sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)không quá nhiều với khẩu vị của tôi.
lgeorget

@schily Thật sao? Nó hoạt động khá tốt với các thư viện ELF theo như tôi có thể nói. Và nó vẫn được sử dụng, ld.so dựa vào bộ đệm được tạo bởi ldconfig.
lgeorget

Người Linux đã hack mã nguồn liên kết Sun cũ để hỗ trợ ELF. Việc triển khai ELF mới từ Sun đã loại bỏ ldconfigtrong một thỏa thuận với AT & T vì bộ nhớ đệm liên kết quá nhạy cảm với các lỗi. Sun sau thêm the tree stooges: moe, laricrlenhư các chương trình trợ giúp cho việc quản lý ELF.
schily

2

Thay thế toàn cầu (không gian) cho :LD_LIBRARY_PATH

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

2

Bạn có thể biên dịch một chương trình thử nghiệm đơn giản với gcc và liên kết thư viện của bạn. Sau đó, bạn có thể kiểm tra các thư viện được sử dụng với ldd. Tôi sử dụng một cái gì đó như thế này:

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed ngăn chặn trình liên kết loại bỏ thư viện, bởi vì không có biểu tượng nào từ thư viện được sử dụng.

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.