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

标签 android gcc linker shared-libraries compiler-flags

我们正在使用第三方静态库,例如用于 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_infoSTV_DEFAULT (如果您的理论是正确的并且您正确地找到了该符号,那么您当前应该在那里找到 STV_HIDDEN)。

修补完 foo.o 后,该符号将不再隐藏,并且当您链接 foo.o 时进入B.so ,它将是全局/导出的。

关于android - 有没有办法在链接时覆盖-fvisibility=hidden?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36273404/

相关文章:

java - 处理程序真正将其消息发布到哪里?

java - findViewById() 在包含的布局上返回 null?

android - 均衡器 getBandLevel(i) 返回值 0

java - 如何在android中为日历事件设置多个闹钟?

c - 与使用 namespace 的外部库链接时如何解决 C 中 undefined reference ?

c++ - odr 使用的变量的模板 static constexpr 定义

c - 在 gcc 中编译时出现警告有何影响?可能会产生什么后果?

编译后的c程序内存地址

c++ - 无法链接到 vtk 6.3/usr/bin/ld : cannot find -lvtkCommon

linux - 链接到静态库后 undefined reference