我正在研究一个脚本,以使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
?还是链接脚本?)来取消隐藏这些符号。这可能吗?
我认为您应该能够在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被编译为与位置无关的代码。
--globalize-symbol
似乎没有此功能,但是您可以使用objcopy
:
ELFkickers rebind
tool
这必须在原始.o文件上完成。如果尝试在.so上执行此操作,那将为时已晚,因为隐藏的符号将从rebind
部分中省略。