Tôi có thư viện được chia sẻ linux, foo.so, được tải từ tệp thực thi sử dụng dlopen("foo.so", RTLD_NOW | RTLD_LOCAL)
. Từ foo.so tôi muốn dlopen một thư viện khác, bar.so, tham chiếu đến các biểu tượng được định nghĩa trong foo.so, nhưng trình liên kết không tìm thấy chúng. Tôi không thể thay đổi RTLD_LOCAL thành RTLD_GLOBAL, vì tôi không có nguồn để thực thi tải. Tôi nghĩ rằng -Wl,--export-dynamic
khi liên kết foo.so có thể giúp nhưng nó không ghi đè cờ địa phương để dlopen. Tính năng hiển thị thuộc tính mới của GCC không giống như cung cấp câu trả lời.dlopen với hai thư viện được chia sẻ, xuất các ký hiệu
Có cách nào tôi có thể hướng dẫn trình liên kết giải quyết các tham chiếu đến các ký hiệu không xác định trong thanh.so với các định nghĩa đó trong foo.so, mà không cần liên kết thanh với -lfoo hoặc tương tự như chuyển các ký hiệu vào thư viện thứ 3 và liên kết cả hai foo và chống lại nó? Điều duy nhất xảy ra với tôi là để dlopen foo.so với RTLD_GLOBAL từ bên trong foo.so chính nó, sau đó dlopen bar.so, nhưng điều đó đánh tôi như một chút lộn xộn. Cảm ơn.
Cảm ơn bạn đã trả lời. Tôi không thể liên kết foo.so với bar.so vì bar.so sẽ là trình cắm thêm do người dùng cung cấp. Tôi cũng không thể vá được file thực thi vì nó thường được root trên hệ thống của khách hàng và tôi không chắc rằng việc vá nó sẽ giảm quá tốt với họ, nó sẽ làm phức tạp quá trình cài đặt một chút. Nó cũng sẽ phá vỡ các thư viện khác mà các exec được mở, một số người trong số họ dựa vào RTLD_LOCAL. Tôi nghĩ rằng tôi sẽ phải đi với dlopen foo.so từ chính nó hack, mà dường như làm việc. Chúc mừng –