2012-08-28 5 views
5

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

Odpowiedz

0

Nie ma sposobu, aby to zrobić. Jeśli jednak struktura "foo" jest pod Twoją kontrolą, możesz przenieść całą logikę w 'foo' do nowej biblioteki współdzielonej, która eksportuje odpowiednie symbole, a następnie połączyć zarówno wtyczki, jak i linię główną z tą biblioteką.

Powiązane problemy