Thay đổi thư viện được liên kết cho một tệp thực thi nhất định (CentOs 6)


29

Tôi có một thực thi được liên kết như thế này:

  $ ldd a.out
        libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.

Trong đó các thư viện libcrypto và libssl là openssl 1.0.0-fips libs. Tôi muốn thử nghiệm với các thư viện 1.0.1 thay vào đó, và vì vậy tôi đã xây dựng chúng trong thư mục nhà của mình. Có cách nào để làm a.outlại với các thư viện openssl mới của tôi mà không phải chịu nhiều đau đớn không? Tôi muốn tránh

  • Phải xem lại a.out(vì các công cụ xây dựng rất phức tạp)
  • Thay đổi mọi cài đặt chung (vì các nhà phát triển khác hoạt động trên máy này)

Có thể làm những gì tôi hy vọng ở đây?

Câu trả lời:


22

Bạn có thể tạm thời thay thế một thư viện khác để thực hiện cụ thể này. Trong Linux, biến môi trường LD_LIBRARY_PATH là một tập hợp các thư mục được phân tách bằng dấu hai chấm, nơi các thư viện nên được tìm kiếm trước, trước tập hợp các thư mục chuẩn; điều này rất hữu ích khi gỡ lỗi thư viện mới hoặc sử dụng thư viện không chuẩn cho các mục đích đặc biệt. Biến môi trường LD_PRELOAD liệt kê các thư viện được chia sẻ với các hàm ghi đè lên bộ tiêu chuẩn, giống như /etc/ld.so.preload. - Thư viện dùng chung

Bạn cũng có thể gọi trình nạp trực tiếp:

/lib/ld-linux.so.2 - đường dẫn thư viện path executable


1
LD_LIBRARY_PATH không ghi đè đường dẫn tìm kiếm mặc định. Tôi đặt nó nhưng ldd vẫn hiển thị cho tôi đường dẫn mặc định của hệ thống chứ không phải đường dẫn bị ghi đè. Mặc dù tôi có thể buộc tải thư viện của riêng mình bằng cách đặt LD_PRELOAD.
Calmarius

18

Viết một kịch bản lệnh bao bọc LD_LIBRARY_PATHbiến môi trường. Đây là mặt dây chuyền PATHcho các thư viện chia sẻ. Đường dẫn tìm kiếm hệ thống luôn được tìm kiếm sau khi các thư mục được liệt kê trong $LD_LIBRARY_PATH. Xem hướng dẫn sử dụng liên kết động để tham khảo.

#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"

Hoặc, một lần, trực tiếp trên dòng lệnh:

LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out

Ngoài ra, nếu bạn muốn sửa đổi nhị phân, hãy thử chrpath , cho phép bạn chỉnh sửa đường dẫn tìm kiếm thư viện được nướng trong tệp thực thi.


2
+1 cho chrpath. Chính xác những gì tôi cần.
Raghav RV

Câu chuyện dễ thương, Microsoft quá ngu ngốc khi dành 2 phút để làm điều này và khuyên mọi người nên sử dụng LD_LIBRARY_PATH thay vì liên kết SQL Server để mở-1.0.0 một cách rõ ràng hoặc biên dịch lại phiên bản openssl.so blog.msdn.microsoft.com/sql_server_team /
Lọ
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.