3

我正在编写一个脚本,以使 uClibc 在现有的 glibc 目标 gcc/binutils 工具链上可用,我剩下的一个问题是pthread_cancel需要dlopen libgcc_s.so.1. 主机 gcc 提供的版本链接到依赖于 glibc,所以我改为使用ld's-u选项来提取所需的符号(及其依赖项)libgcc_eh.a以进行替换libgcc_s.so.1

gcc -specs uclibc.specs -Wl,-u,_Unwind_Resume -Wl,-u,__gcc_personality_v0 \
    -Wl,-u,_Unwind_ForcedUnwind -Wl,-u,_Unwind_GetCFA -shared -o libgcc_s.so.1

原则上我会完成,但是其中的所有符号libgcc_eh.a都将其可见性设置为隐藏,因此在输出.so文件中,它们都变为本地并且不会添加到.dynsym符号表中。

我正在寻找一种在文件或原始文件objcopy上使用 binutils(也许?或链接器脚本?)的方法来取消隐藏这些符号。这可能吗?.so.olibgcc_eh.a

4

2 回答 2

2

objcopy似乎没有这个功能,但你可以使用ELFkickersrebind工具来做到这一点:

rebind --visibility default file.o SYMBOLS...

这必须在原始 .o 文件上完成。如果您尝试在 .so 上执行此操作,则为时已晚,因为该.dynsym部分中将省略隐藏符号。

于 2020-02-12T22:52:34.173 回答
1

我认为您应该可以--globalize-symbol在 objcopy 中使用。

例如

$ nm /usr/lib/gcc/i686-redhat-linux/4.6.3/libgcc_eh.a | grep emutls_alloc

00000000 t emutls_alloc
$ objcopy --globalize-symbol=emutls_alloc /usr/lib/gcc/i686-redhat-linux/4.6.3/libgcc_eh.a /tmp/libgcc_eh.a
$ nm /tmp/libgcc_eh.a |grep emutls_alloc
00000000 T emutls_alloc

您可以多次向 objcopy 提供 --globalize-symbol,但您需要明确提及要全球化的所有符号的完整符号名称。

虽然我不确定将 libgcc_eh.a 变成共享对象会发生什么样的破坏,因为 libgcc_eh.a 可能是在没有 -fpic/-fPIC 的情况下编译的。原来 libgcc_eh.a 被编译为与位置无关的代码。

于 2012-08-17T18:31:02.457 回答