有没有办法在链接时覆盖-fvisibility = hidden?

时间:2016-03-29 00:22:23

标签: android gcc linker shared-libraries compiler-flags

我们正在使用第三方静态库,假设A.a用于Android开发。我们将其作为共享库链接,并且在一个应用中可以正常工作,但在使用B.so构建另一个C.so时,A.a中的某些符号无法找到。我们已使用-Wl,--export-dynamic-Wl,--whole-archive来构建B.so。我们使用nm来检查这些符号,它存在但列为“t”而不是“T”,这意味着它是本地符号而不是外部符号。在调查som后,A.a-fvisibility=hidden构建的接缝。

但是由于某些原因我们很难立即获得新的构建库,所以我们需要一些解决方法。有没有办法将这些符号导出为全局符号,即使它在链接时-fvisibility=hidden内使用B.so进行构建。

1 个答案:

答案 0 :(得分:0)

  

我们使用nm来检查那些符号

您不应该:在ELF平台上,nm 不足。请改用readelf -Ws

  

它存在,但列为“t”而不是“T”,这意味着它是本地符号而不是外部符号。在som调查之后,使用-fvisibility =隐藏A.a构建的接缝。

您的结论并未遵循:许多原因符号可能会显示为t。使用-fvisibility=hidden编译只是众多可能中的一种。

  

有没有办法将这些符号导出为全局符号,即使它已使用-fvisibility=hidden

构建

符号表只是Elf{32,64}_Sym[] s的线性表。您可以使用readelf -WS foo.o | grep '\.symtab'在目标文件中找到此表的开头,找到readelf -Ws中的违规符号数,并通过将两者结合起来查找foo.o中符号的偏移量:

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

获得偏移后,您可以使用.st_info覆盖其STV_DEFAULT(如果您的理论正确并且您正确找到了符号,那么您当前应该找到STV_HIDDEN。< / p>

修补完foo.o后,该符号将不再被隐藏,当您将foo.o链接到B.so时,它将全局/导出。