2012-01-09 45 views
9

Tôi có thư viện được chia sẻ được tải bằng cách sử dụng dlopen (với cờ RTLD_NOW | RTLD_GLOBAL). Nếu thư viện này đang sử dụng các chức năng từ chương trình chính, thì nó sẽ không tải. Vì vậy, tôi kết thúc với mã tương tự cho lib này được chia sẻ, ngay cả khi tôi dỡ (sử dụng dlclose), thay đổi, biên dịch, (lại) tải nó.C++: dlclose không dỡ bỏ thư viện được chia sẻ

Mục tiêu của tôi thực sự là tải lại cùng một thư viện sau khi thực hiện thay đổi, do đó tôi không phải khởi chạy lại toàn bộ chương trình để kiểm tra mã của mình.

Tôi đang sử dụng g ++ 4.2.3, trên Linux Ubuntu 10.04.

(chỉnh sửa)

giải quyết:

"nạp thư viện sử dụng một biểu tượng do rtld_global". Thật vậy, tôi đã có biểu tượng của một .a nhúng khi liên kết mà có lẽ được gọi trở lại và ngăn chặn thư viện của tôi để đóng ... Tôi nghĩ rằng nó có thể xác minh rằng một lib dỡ bằng cách sử dụng dlopen (..., RTLD_NOLOAD) để kiểm tra thư viện đã được tải xuống chính xác.

+0

Bạn có đang giải phóng xử lý cho dll của mình không? – Felipe

+0

Có thể bạn cần phải cụ thể hơn về nền tảng nào (Linux?) Và phiên bản nào bạn đang sử dụng. Nó có thể là vấn đề cho loại vấn đề này. –

+0

@Komyg: Tôi đang sử dụng dlclose (xử lý), vì vậy tôi giả định rằng xử lý được phát hành làm như vậy ... – Ben

Trả lời

4

Hàm dlclose() giảm số lượng tham chiếu trên tay cầm thư viện động. Nếu số tham chiếu giảm xuống 0 và không có thư viện được tải nào khác sử dụng các biểu tượng trong đó, thì thư viện động sẽ được tải xuống.

Ngoài ra, RTLD_NODELETE (khi dlopen) làm cho dlclose không dỡ bỏ thư viện.

Vì bạn chưa sử dụng RTLD_NODELETE, có thể xảy ra nhất là thư viện được tải sử dụng ký hiệu do RTLD_GLOBAL.

+0

"thư viện được tải sử dụng ký hiệu do RTLD_GLOBAL". thực sự, tôi đã có biểu tượng của một .a nhúng khi liên kết mà có lẽ được gọi trở lại và ngăn chặn các thư viện để đóng ... Tôi nghĩ rằng tôi có thể xác minh nếu một lib unloaded bằng cách sử dụng dlopen (RTLD_NOLOAD) vào nó để kiểm tra thư viện đã được giải mã một cách chính xác – Ben

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