Mam program foo
, który może ładować wtyczki za pośrednictwem dlopen()
. Piszę jedną taką wtyczkę foobar
, która łączy się z funkcjonalnością udostępnianą przez bibliotekę zewnętrzną libfoo
.Jak inteligentnie wykrywać niezdefiniowane symbole podczas łączenia wtyczki na GNU/Linux?
W systemie Linux, buduję foobar
takiego:
gcc -fpic -c -o foobar.o foobar.c
gcc -fpic -shared -o foobar.so foobar.o -lbar
tej pory tak dobrze.
Problem polega na tym, że nie wykrywa on niezdefiniowanych symboli, na przykład z powodu błędów w kodzie lub niedopasowania między plikami nagłówkowymi i biblioteką. Link się powiódł, a otrzymasz błąd dopiero po załadowaniu wtyczki lub wywołaniu czegoś w wtyczce (w zależności od flag dlopen()
).
Aby wykryć niezdefiniowane symbole w bibliotece współużytkowanej, zwykle używa się -Wl,-z,defs
lub może -Wl,--no-allow-shlib-undefined
. Ale to się nie powiedzie, ponieważ będzie również raportować symbole, które powinny być znalezione w czasie wykonywania w programie foo
. Chciałbym wykryć niezdefiniowane symbole, z wyjątkiem tych dostarczonych przez program hostingowy.
W systemie Mac OS X odbywa się to na przykład za pomocą opcji -bundle_loader
. Komenda równoważnego łącza będzie miała postać:
gcc -bundle -o foobar.so foobar.o -lbar -bundle_loader=foo
i wykryje niezdefiniowane symbole w żądany sposób.
Jak to zrobić w systemie GNU/Linux lub ogólnie w GNU ld? (Przejrzałem wszystkie opcje wymienione na stronie man ld
, ale żadna nie wyglądała obiecująco.)