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.)