我们正在使用第三方静态库,假设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
进行构建。
答案 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
时,它将全局/导出。