2016-03-29 67 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时,它将被全局/导出。

相关问题