2012-08-28 19 views
5

Tôi có một chương trình foo có thể tải các plugin qua dlopen(). Tôi đang viết một plugin như vậy foobar mà giao diện cho chức năng được cung cấp bởi thư viện của bên thứ ba libfoo.Làm thế nào để thông minh phát hiện các biểu tượng không xác định khi liên kết một plugin trên GNU/Linux?

Trên Linux, Tôi đang xây dựng foobar như thế này:

gcc -fpic -c -o foobar.o foobar.c 
gcc -fpic -shared -o foobar.so foobar.o -lbar 

Cho đến nay rất tốt.

Vấn đề là điều này không phát hiện các biểu tượng không xác định, ví dụ vì các lỗi trong mã hoặc không khớp giữa các tệp tiêu đề và thư viện. Liên kết thành công và bạn chỉ gặp lỗi sau khi tải plugin hoặc khi bạn gọi một thứ gì đó trong plugin (tùy thuộc vào các cờ dlopen()).

Để phát hiện các ký hiệu không xác định trong thư viện được chia sẻ, người ta thường sử dụng -Wl,-z,defs hoặc có lẽ -Wl,--no-allow-shlib-undefined. Nhưng điều này sẽ thất bại vì nó cũng sẽ báo cáo các biểu tượng được cho là sẽ được tìm thấy trong chương trình foo vào thời gian chạy. Tôi muốn phát hiện các ký hiệu không xác định trừ các ký hiệu được cung cấp bởi chương trình lưu trữ. Ví dụ:

Trên Mac OS X, tùy chọn này được thực hiện theo tùy chọn -bundle_loader. Lệnh liên kết tương đương sẽ là

gcc -bundle -o foobar.so foobar.o -lbar -bundle_loader=foo 

và phát hiện các ký hiệu không xác định theo cách tôi muốn.

Làm thế nào để thực hiện điều này trên GNU/Linux hoặc với GNU ld nói chung? (Tôi đã xem xét tất cả các tùy chọn được liệt kê trên trang người đàn ông ld, nhưng không có ai trông đầy hứa hẹn.)

Trả lời

0

Không có cách nào mà tôi biết để làm điều này. Tuy nhiên, nếu cấu trúc của 'foo' nằm dưới sự kiểm soát của bạn, bạn có thể di chuyển tất cả logic trong 'foo' vào một thư viện được chia sẻ mới để xuất các biểu tượng thích hợp và sau đó liên kết cả hai plugin và đường chính của bạn với thư viện đó.

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