2013-08-27 33 views
10

Chương trình của tôi phụ thuộc vào libcurl.so.3, nhưng trong RHEL6, không có phần mềm như thế này libcurl.so.3 ->libcurl.so.4 (chương trình của tôi có thể chạy trơn tru khi tôi tạo liên kết này). Nhưng có một liên kết mềm như thế này: libcurl.so->libcurl.so.4.Có cách nào để thay đổi SONAME của nhị phân trực tiếp?

Tôi muốn sửa đổi SONAME của libcurl.so.3.0.0.0 trực tiếp từ libcurl.so.3 đến libcurl.so. Sau đó, tôi có thể chạy chương trình của tôi trên RHEL 6 mà không cần tạo liên kết mềm.

Có lẽ giải pháp của tôi là ngu ngốc, nhưng tôi nghĩ việc học cách sửa đổi trực tiếp nhị phân là một điều thú vị.

Tahnk bạn cho bình luận của bạn, devnull. có lẽ tôi không nói rõ.

$ readelf -d libcurl.so.3.0.0

phân khúc động tại 0x303cc bù đắp chứa 25 các mục:

Loại thẻ Tên/Giá trị

0x00000001 (CẦN) thư viện chia sẻ: [libssl .so.2]

0x0000000e (sONAME) Thư viện soname: [libcurl.so.3] ---> tôi muốn thay đổi điều này để libcurl.so

+0

gì bạn đang nói về là * đổi tên * một tập tin hoặc một liên kết tượng trưng, ​​nó không * sửa đổi * a nhị phân. – devnull

+1

Bạn có thể tạo một bản sao của "libcurl.so.4", đổi tên nó thành "libcurl.so.3" và sử dụng trình chỉnh sửa hệ thập lục phân để đổi tên mục nhập SONAME từ "libcurl.so.4" thành "libcurl.so.3 ". Thường thì điều này sẽ không hoạt động vì thông tin phiên bản cũng có mặt trong thư viện động. –

+0

Tôi nghĩ rằng cách dễ nhất để có được là xây dựng lại libcurl và hack một chút các quy tắc xây dựng để có SONAME bạn muốn. Đối với các thay đổi xây dựng bài đăng, tôi sẽ không tư vấn phiên bản nhị phân. Có một dự án về việc vá định dạng ELF http://nixos.org/patchelf.html, nó không cho phép thay đổi SONAME, nhưng nó có thể cung cấp một số ý tưởng về cách thực hiện một điều như vậy. – joetde

Trả lời

0

Bạn nên tránh gỡ bỏ phiên bản của đối tượng SO, ví dụ như khi ứng dụng của bạn phụ thuộc vào một libc cụ thể (libc.so.6).

Cách thích hợp để làm điều đó, nếu bạn muốn sử dụng lib khác đang sử dụng biến LD_PRELOAD trước khi gọi ứng dụng của bạn

Nếu bạn đặt LD_PRELOAD đến đường dẫn của tập tin mới, tập tin đó sẽ được nạp trước khi bất kỳ thư viện khác (bao gồm cả thời gian chạy C, libc.so).

2

Có, bạn có thể sử dụng patchelf như thế này (từ Readme của nó):

patchelf --set-soname libnewname.so.3.4.5 path/to/libmylibrary.so.1.2.3