2010-07-29 7 views
6

Ich habe eine Linux-Shared Library, foo.so, die aus einer ausführbaren Datei mit dlopen("foo.so", RTLD_NOW | RTLD_LOCAL) geladen wird. Von foo.so würde ich gerne eine andere Bibliothek öffnen, bar.so, die auf Symbole verweist, die in foo.so definiert sind, aber der Linker findet sie nicht. Ich kann RTLD_LOCAL nicht in RTLD_GLOBAL ändern, weil ich nicht die Quelle für die ausführbare Datei habe, die das Laden ausführt. Ich dachte, -Wl,--export-dynamic wenn Verknüpfung foo.so könnte helfen, aber es überschreibt nicht das lokale Flag zu dlopen. Die neue Attributsichtbarkeitsfunktion von GCC sieht auch nicht so aus, als ob sie die Antwort bietet.dlopen mit zwei gemeinsamen Bibliotheken, Exportieren von Symbolen

Gibt es eine Weise, die ich den Linker anweisen können Verweise auf undefinierte Symbole in bar.so zu diesen Definitionen in foo.so zu lösen, ohne bar Verknüpfung mit -lfoo oder Ähnlichkeit der Symbole in eine dritte Bibliothek bewegt und verbindet beide foo und Bar dagegen? Das einzige, was mir in den Sinn kommt, ist, dloopen foo.so mit RTLD_GLOBAL von foo.so selbst, dann dlopen bar.so, aber das scheint mir ein bisschen durcheinander. Vielen Dank.

Antwort

4

Link foo.so gegen bar.so.

Wenn die ausführbare Datei dlopen() s foo.so, bar.so wird auch geladen werden.

Alternativ binäre Patch die ausführbare Datei RTLD_GLOBAL zu den Flags für dlopen() Aufruf hinzufügen. Der Code wird so etwas wie

movl $2, 4(%esp)  # $2 == RTLD_NOW; RTLD_LOCAL is 0 
    movl $0xNNNNN, (%esp) # $0xNNNNN == &"foo.so" 
    call dlopen 

Flecken es movl $0x102, 4(%esp) schauen statt (RTLD_GLOBAL == 0x100) und voilà.

EDIT:
Wenn Sie den Namen von bar.so kennen, dann können Sie foo.so gegen einen "Stub" verlinken bar.so. Es spielt keine Rolle, dass Sie nicht "real" haben bar.so; Es kommt darauf an, dass foo.so davon abhängig ist. Zur Laufzeit wird diese Abhängigkeit dazu führen, dass bar.so geladen wird, wenn foo.so geladen wird.

+0

Danke für die Antwort. Ich kann foo.so nicht mit bar.so verknüpfen, weil bar.so ein von Benutzern bereitgestelltes Plug-in ist. Ich kann die ausführbare Datei auch nicht patchen, da diese normalerweise auf dem System des Kunden Root-Besitzer ist und ich bin mir nicht sicher, ob das Patchen zu gut für sie ist. Das kompliziert den Installationsvorgang erheblich. Es würde auch andere Bibliotheken brechen, die der Exec öffnet, einige von ihnen verlassen sich auf RTLD_LOCAL. Ich denke, ich muss mit dem dlopen foo.so von sich gehen hack, das scheint zu funktionieren. Prost –

Verwandte Themen