2016-03-29 15 views
0

Wir verwenden eine statische Bibliothek von Dritten, sagen wir A.a für Android-Entwicklung. Wir verlinken es als Shared Library und es funktioniert gut in der einen App, aber wenn B.so verwenden, um ein anderes C.so zu bauen, können einige Symbole in A.a nicht finden. Wir haben bereits -Wl,--export-dynamic und -Wl,--whole-archive verwendet, um B.so zu bauen. Wir verwenden nm, um diese Symbole zu überprüfen, es existiert aber Liste als “t” anstelle von “T”, was bedeutet, dass es lokale Symbole anstelle von externen Symbolen ist. Nähte die A.a werden mit -fvisibility=hidden nach som Untersuchung gebaut.Gibt es eine Möglichkeit zum Überschreiben der -fvisibility = zum Zeitpunkt der Verbindung ausgeblendet?

Aber aus irgendeinem Grund ist es schwer für uns, sofort eine neue Build-Bibliothek zu bekommen, also brauchen wir eine Workaround. Gibt es eine Möglichkeit, diese Symbole als global zu exportieren, obwohl es mit -fvisibility=hidden in B.so zur Verbindungszeit erstellt wurde.

Antwort

0

Wir nm haben unter Verwendung dieser Symbole

Sie sollten nicht überprüfen: auf ELF-Plattformen, nm ist unzureichend für den Job. Verwenden Sie stattdessen readelf -Ws.

Es existiert aber Liste als "t" anstelle von "T", was bedeutet, dass es lokale Symbole anstelle von externen Symbolen ist. Nähte die A.a sind mit -visibility = versteckt nach einer Untersuchung gebaut.

Ihr Abschluss folgt nicht: Es gibt viele Gründen ein Symbol als t zeigen können. Mit -fvisibility=hidden kompiliert zu sein, ist nur eine von vielen Möglichkeiten.

Gibt es eine Möglichkeit, diese Symbole als global zu exportieren sogar mit -fvisibility=hidden

Die Symboltabelle wird nur eine lineare Tabelle von Elf{32,64}_Sym[] s bauen war. Sie können den Beginn dieser Tabelle in der Objektdatei mit readelf -WS foo.o | grep '\.symtab', finden die Anzahl der beanstandeten Symbol aus readelf -Ws, finden und den Versatz des Symbols in der foo.o durch die Kombination der beiden finden:

sym-offset = .symtab offset + (sym-number * sizeof(Sym)) 

Sobald Sie das haben Offset, Sie können seine .st_info mit STV_DEFAULT überschreiben (wenn Ihre Theorie korrekt ist und Sie das Symbol richtig gefunden haben, sollten Sie STV_HIDDEN dort finden).

Sobald Sie Ihre foo.o gepatcht haben, wird das Symbol nicht länger ausgeblendet, und wenn Sie foo.o in B.so verknüpfen, wird es global/exportiert werden.