2012-04-30 53 views
1

我正在制作一个脚本,使uClibc可用于现有的glibc目标gcc/binutils工具链,而我留下的一个问题是pthread_cancel需要dlopenlibgcc_s.so.1。与主机GCC提供的版本是与依赖于glibc的,所以我不使用ld-u选项从libgcc_eh.a在需要的符号(和它们的依赖)拉进行替换libgcc_s.so.1有没有办法使用GNU binutils取消隐藏隐藏可见性符号?

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符号表。

我在任的.so文件或原始.o文件libgcc_eh.a来取消隐藏这些符号寻找一种方式来使用的binutils(也许objcopy?或者一个链接脚本?)。这可能吗?

回答

1

我想你应该能够在objcopy把使用--globalize-symbol

例如

 
$ 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 

可以提供--globalize符号几次objcopy命令,但你需要明确提及所有要全球化的符号的全符号名。

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

+0

想必在'libgcc_eh.a'目标文件应在PIC共享库或PIE可执行文件使用,因为它没有被使用的共享'libgcc_s.so'当被载入到他们,但我可能是错误的。无论如何,它至少在i386上允许textrels。 –

+0

刚刚看到您的编辑。留下我的评论,因为我认为它解释了*为什么*代码被编译为PIC。 –