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