是否可以使用GNU binutils取消隐藏隐藏的可见性符号?

问题描述 投票:2回答:2

我正在研究一个脚本,以使uClibc在以glibc为目标的现有gcc / binutils工具链上可用,而我剩下的一个问题是pthread_cancel需要dlopen libgcc_s.so.1。主机gcc随附的版本链接到依赖于glibc的文件,所以我改为使用ld-u选项从libgcc_eh.a中提取所需的符号(及其依赖项)以进行替换[C0 ]:

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文件或原始.so文件使用binutils(也许是.o?还是链接脚本?)来取消隐藏这些符号。这可能吗?

c gcc visibility binutils
2个回答
1
投票

我认为您应该能够在objcopy中使用libgcc_eh.a

例如

$ nm /usr/lib/gcc/i686-redhat-linux/4.6.3/libgcc_eh.a | grep emutls_alloc00000000吨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_alloc00000000个Emutls_alloc

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

尽管我不确定将libgcc_eh.a转换为共享对象会发生哪种破损,因为libgcc_eh.a可能是在没有-fpic / -fPIC的情况下编译的。 证明libgcc_eh.a被编译为与位置无关的代码。


0
投票

--globalize-symbol似乎没有此功能,但是您可以使用objcopy

ELFkickers rebind tool

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

© www.soinside.com 2019 - 2024. All rights reserved.