2012-08-28 6 views
5

Ich habe ein Programm foo, das Plugins über dlopen() laden kann. Ich schreibe ein solches Plugin foobar, das Schnittstellen zu Funktionalität von einer Drittanbieter-Bibliothek libfoo bereitstellt.Wie erkennt man unklare Symbole beim Verknüpfen eines Plugins unter GNU/Linux?

Unter Linux Ich baue foobar wie folgt aus:

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

So weit so gut.

Das Problem besteht darin, dass dies nicht definierte Symbole nicht erkennt, z. B. aufgrund von Fehlern im Code oder Nichtübereinstimmungen zwischen Headerdateien und Bibliothek. Die Verbindung ist erfolgreich, und Sie erhalten erst später eine Fehlermeldung, wenn Sie das Plugin laden oder wenn Sie etwas im Plugin aufrufen (abhängig von dlopen() Flags).

Um undefinierte Symbole in einer gemeinsam genutzten Bibliothek zu erkennen, würde man normalerweise -Wl,-z,defs oder vielleicht -Wl,--no-allow-shlib-undefined verwenden. Dies wird jedoch fehlschlagen, da es zur Laufzeit auch Symbole anzeigt, die im Programm foo enthalten sein sollen. Ich möchte nicht definierte Symbole erkennen, außer denen, die vom Hosting-Programm zur Verfügung gestellt werden.

Unter Mac OS X wird dies beispielsweise mit der Option -bundle_loader durchgeführt. Der äquivalente Verbindungsbefehl wäre

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

und das erkennt undefinierte Symbole in der Art, wie ich will.

Wie funktioniert das unter GNU/Linux oder mit GNU ld im Allgemeinen? (Ich habe alle Optionen auf der Manpage ld durchgesehen, aber keine sah vielversprechend aus.)

Antwort

0

Es gibt keine Möglichkeit, dass ich weiß, dies zu tun. Wenn die Struktur von 'foo' jedoch unter Ihrer Kontrolle steht, können Sie möglicherweise die gesamte Logik in 'foo' in eine neue gemeinsam genutzte Bibliothek verschieben, die die richtigen Symbole exportiert, und dann Ihre Plugins und Ihre Hauptlinie mit dieser Bibliothek verknüpfen.

Verwandte Themen