2010-05-07 26 views
5

Tôi đã có một chương trình C++ liên kết tại thời gian chạy với, cho phép nói, mylib.so. sau đó, cùng một chương trình sử dụng dlopen()/dlsym() để tải một hàm từ myplugin.so, thư viện động mà đến lượt nó có các phụ thuộc vào mylib.so.là thời gian chạy liên kết quả cầu thư viện được chia sẻ giữa các plugin được nạp với dlopen?

Câu hỏi của tôi là: chương trình và chức năng trong plugin có truy cập vào cùng một vùng được định nghĩa trong mydlib.so trong cùng một vùng bộ nhớ dành riêng cho chương trình hay không. ? nếu sau này là hành vi mặc định, có thể thay đổi điều đó không?

Cảm ơn trước =)!

Trả lời

1

Toàn cầu trong chương trình chính mà dlopen sẽ hiển thị cho mã được tải động. Tuy nhiên, lời khuyên tốt nhất mà tôi đã thấy cho đến nay (đặc biệt là nếu bạn muốn có cả mã di động mơ hồ) chỉ có các cuộc gọi hàm được truyền qua phân chia liên kết và không xuất bất kỳ biến nào theo cả hai hướng. Nó cũng tốt nhất nếu có API cho mã được tải để đăng ký các phần thú vị của API của nó với trình tải (ví dụ: "Đây là cách tôi cung cấp này SPI để vẽ các chú thích") vì đó là cách làm tốt hơn callbacks thay vì chỉ nghiền mọi thứ lại với nhau.

[EDIT]: Lý do khác để làm điều này là nếu bạn đang mô phỏng liên kết yếu trên nền tảng không hỗ trợ nó. Đó là rất nhiều như một trong những khác tôi liệt kê, ngoại trừ việc nó là chương trình chính đó là xây dựng SPI ra khỏi API xuất khẩu bởi các thư viện động hơn là .so xuất khẩu nó một cách rõ ràng khi khởi động. Đó là thứ hai thực sự tốt nhất, nhưng bạn làm với những gì bạn đã có hơn là có nhu cầu (tốt, trừ khi bạn đang chuẩn bị để làm công việc bằng cách viết một số loại thư viện kết nối).

+0

+1 để sử dụng API/SPI sạch – neuro

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