Làm thế nào để một nhị phân unix quyết định nơi để có được một thư viện chia sẻ?


2

Tôi sử dụng một thực thi Linux, các thư viện được đặt ở nhiều nơi. Tôi có nghĩa là cùng một thư viện với phiên bản khác nhau. Vấn đề là chương trình thực thi nhặt được tệp thực thi trong thư viện sai. HĐH là Ubuntu 64 bit.

Các thư viện được đặt / usr / local / lib và / usr / lib / x86_64-linux-gnu. Tôi muốn nó sẽ sử dụng phiên bản / usr / local / lib.

Để buộc nó sử dụng phiên bản / usr / local / lib. Tôi đã sao chép .so từ đó sang / usr / lib / x86_64-linux-gnu và xóa .so tham chiếu ở đó. Kết quả là phần mềm (VLC) không sử dụng các thư viện mới được sao chép nhưng nó đã ngừng hoạt động bình thường và hoàn toàn không tìm thấy thư viện. Mặc dù thực tế, nó đã ở đằng kia. Vì vậy, không rõ làm thế nào VLC quyết định sử dụng thư viện nào.

Rõ ràng là nó sử dụng các tệp trong /etc/ld.so.conf.d để lấy đường dẫn thư viện. .

LD_LIBRARY_PATH chưa được đặt.

Cập nhật:

Tôi nghĩ rằng tôi chỉ có thể thêm một phiên bản khác, chương trình sẽ sử dụng phiên bản đó nhưng có vẻ như phiên bản của thư viện được đặt ở thời gian biên dịch cho tệp thực thi đã cho. Vì vậy, nó sẽ không sử dụng phiên bản mới, chỉ vì tôi xóa một phiên bản cũ.


LD_LIBRARY_PATH chưa được đặt. <- đó là vấn đề của bạn
Gung Foo

tại sao bạn nói như vậy?
Aftershock

bởi vì đó là nơi các thư viện được tìm kiếm
Gung Foo

Những thứ đó có được thiết lập khi chương trình được biên dịch và liên kết không? Vui lòng cung cấp thêm chi tiết bao gồm các lỗi cụ thể và thư viện trong câu hỏi.
Ярослав Рахматуллин

vâng, tôi nghĩ rằng tôi chỉ có thể thêm một phiên bản khác, chương trình sẽ sử dụng phiên bản đó nhưng có vẻ như phiên bản của thư viện được đặt ở thời gian biên dịch. Vì vậy, nó sẽ không sử dụng phiên bản mới, chỉ vì tôi xóa một phiên bản cũ.
Aftershock

Câu trả lời:


0

Hai cách này có thể đạt được

a) Cài đặt rpathtại thời gian liên kết - đây là một cách rất xấu và không thể kiểm soát được và nên tránh bất cứ khi nào có thể

b) Sử dụng LD_LIBRARY_PATHbiến môi trường (đừng quên xuất nếu bạn thay đổi nó!)


Nếu bạn muốn sử dụng một phiên bản cụ thể / sửa đổi / foo-reason cho nhị phân của mình, tôi đề nghị

a) liên kết với nó một cách tĩnh nếu giấy phép cho phép

b) sử dụng LD_PRELOADnhư được giải thích ở đây https://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick

c) sửa đổi LD_LIBRARY_PATH(đảm bảo rằng đường dẫn của bạn là đầu tiên trong danh sách đó, chúng được tìm kiếm theo thứ tự) bằng cách sử dụng một tập lệnh chạy mà thực hiện điều đó

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.