2010-07-29 20 views
6

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.

Trả lời

4

Liên kết foo.so với số bar.so.

Khi thực thi dlopen() s foo.so, bar.so cũng sẽ được tải.

Cách khác, vá nhị phân tệp thực thi để thêm RTLD_GLOBAL vào cờ cho cuộc gọi dlopen(). Mã sẽ giống như thế

movl $2, 4(%esp)  # $2 == RTLD_NOW; RTLD_LOCAL is 0 
    movl $0xNNNNN, (%esp) # $0xNNNNN == &"foo.so" 
    call dlopen 

patch nó để movl $0x102, 4(%esp) thay vì (RTLD_GLOBAL == 0x100), và thì đấy.

EDIT:
Nếu bạn biết tên của bar.so, sau đó bạn có thể liên kết foo.so chống lại một "sơ khai" bar.so. Không quan trọng là bạn không có "thực" bar.so; tất cả những gì quan trọng là foo.so có sự phụ thuộc vào nó. Khi chạy, phụ thuộc đó sẽ khiến cho bar.so được tải bất cứ khi nào foo.so được tải.

+0

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 –

Các vấn đề liên quan