2016-03-29 116 views
0

我們正在使用第三方靜態庫,比如說用於android開發的A.a。我們將它作爲共享庫鏈接,並且它在一個應用程序中正常工作,但是當使用B.so來構建另一個C.so時,A.a中的某些符號找不到。我們已經使用-Wl,--export-dynamic-Wl,--whole-archive來構建B.so。我們使用nm來檢查這些符號,它存在但列表爲「t」而不是「T」,這意味着它是本地符號而不是外部符號。在som調查之後,接縫A.a-fvisibility=hidden一起構建。有沒有什麼辦法可以覆蓋-fvisibility =隱藏鏈接時間?

但由於某些原因,我們很難立即獲得新的構建庫,因此我們需要一些解決方法。有沒有辦法將這些符號導出爲全局符號,即使它已經在B.so鏈接時使用-fvisibility=hidden構建。

回答

0

我們用納米來檢查這些符號

你不應該:在ELF平臺上,nm不足作業。改爲使用readelf -Ws

它存在但列表爲「t」而不是「T」,這意味着它是本地符號而不是外部。在som調查之後,接縫A.a用-fvisibility =隱藏構建。

你的結論不是:有很多原因一個符號可能會顯示爲一個t。與-fvisibility=hidden編譯只是衆多可能性之一。

有什麼辦法來導出這些全球甚至已經以-fvisibility=hidden

建符號表的符號是Elf{32,64}_Sym[]只是個線性表。你可以找到這個表readelf -WS foo.o | grep '\.symtab'目標文件中的開始,從readelf -Ws發現違規符號的數量,並且發現通過結合兩個抵消foo.o符號:

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

一旦你的偏移,你可以用STV_DEFAULT覆蓋它的.st_info(如果你的理論是正確的,並且你找到了正確的符號,你應該在當前找到STV_HIDDEN)。

修補foo.o後,該符號將不再隱藏,並且當您將foo.o鏈接到B.so時,它將被全局/導出。

相關問題