我们正在使用第三方静态库,例如用于 Android 开发的 A.a
。我们将其链接为共享库,它在一个应用程序中工作正常,但是当使用 B.so
构建另一个 C.so
时,A.a< 中的一些符号
找不到。我们已经使用 -Wl,--export-dynamic
和 -Wl,--whole-archive
来构建 B.so
。我们使用nm
来检查这些符号,它存在,但列出为“t”
而不是“T”
,这意味着它是本地符号而不是外部的。经过一些调查后,A.a
的接缝是使用 -fvisibility=hidden
构建的。
但是由于某些原因我们很难立即获得新的构建库,所以我们需要一些解决方法。有没有办法将这些符号导出为全局符号,即使它是在链接时在 B.so
中使用 -fvisibility=hidden
构建的。
最佳答案
We have using nm to check those symbols
您不应该:在 ELF 平台上,nm
不适合这项工作。使用readelf -Ws
相反。
it exist but list as “t” instead of “T”,which means it is local symbols instead of external. Seams the A.a are build with -fvisibility=hidden after som investigation.
您的结论并不成立:符号显示为 t
有很多原因。 。正在编译-fvisibility=hidden
这只是众多可能性中的一种。
Is there any way to export those symbols as global even it has been build with
-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
)。
修补完 foo.o
后,该符号将不再隐藏,并且当您链接 foo.o
时进入B.so
,它将是全局/导出的。
关于android - 有没有办法在链接时覆盖-fvisibility=hidden?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36273404/