2008-12-02 19 views
8

Tôi có hai thư viện của bên thứ ba đôi khi có cùng tên biểu tượng được xuất. Khi tệp thực thi được tải, ld thường chọn sai và tôi sẽ gặp sự cố. Tôi không thể làm quá nhiều về nội dung của các thư viện này, vì vậy có thể có cách để hướng dẫn ld cách tìm sự giải thích thích hợp?Ẩn (các) biểu tượng trong đối tượng được chia sẻ từ LD

Hệ điều hành - Solaris 10, chương trình của tôi được tạo bởi autoconf/autotools/gcc, thư viện xung đột là libclntsh (một phần của trình điều khiển Oracle) và OpenLDAP. Thật không may, tôi không thể sử dụng Oracle thực hiện của khách hàng LDAP - nó thiếu nhiều tính năng OpenLDAP có.

được sửa đổi: Mối liên hệ là như sau: libclntsh.so-> A.so-> TRANG CHỦ < -B.so < -libldap_r.so

+0

Hi Dmitry. Xem [câu hỏi của tôi] (http://stackoverflow.com/questions/9909528/how-can-i-remove-a-symbol-from-a-shared-object). Rõ ràng, bạn có thể sử dụng ['objcopy -N foo'] (http://linux.about.com/library/cmd/blcmdl1_objcopy.htm) để xóa biểu tượng của đối tượng dùng chung. –

Trả lời

10

Nếu bạn không cần phải liên kết trong cả hai thư viện chia sẻ tại thời gian biên dịch (không rõ ràng trong câu hỏi của bạn), bạn có thể sử dụng -Bdirect cho thư viện được chia sẻ. Điều này sẽ ghi lại cho tất cả các biểu tượng từ thư viện được chia sẻ nơi chúng đã được tìm thấy; nếu sau đó tại thời gian chạy, định nghĩa thứ hai của biểu tượng sẽ xuất hiện (từ thư viện được chia sẻ khác), nó sẽ bị bỏ qua.

4

Một giải pháp là đặt biến môi trường LD_PRELOAD vào thư viện có biểu tượng sẽ được ưu tiên. (Nếu thư viện đó đã chia sẻ các phụ thuộc thư viện của riêng nó, bạn có thể cần tải trước tất cả các phụ thuộc của nó; chỉ cần đặt LD_PRELOAD vào danh sách thư viện phụ thuộc, cách nhau bằng dấu cách.)