【发布时间】:2016-05-11 01:48:05
【问题描述】:
我有一个简单的测试程序调用pthread_cond_broadcast。
当与ld 链接器链接时,会显示:
案例一:
$ nm ld-test | grep cond_broadcast
U pthread_cond_broadcast@@GLIBC_2.3.2
当与gold 链接器链接时,它显示:
案例 2:
$ nm gold-test | grep cond_broadcast
U pthread_cond_broadcast
pthread/libc 包含几个具有不同版本符号的 pthread_cond_broadcast 符号,大概是因为 ABI 已更改。
$ nm /lib64/libc.so.6 |grep cond_broadca
00000036b84f7d30 t __pthread_cond_broadcast
00000036b85278f0 t __pthread_cond_broadcast_2_0
00000036b84f7d30 T pthread_cond_broadcast@@GLIBC_2.3.2
00000036b85278f0 T pthread_cond_broadcast@GLIBC_2.2.5
$ nm /lib64/libpthread.so.0 |grep cond_broadcast
00000036b880bee0 t __pthread_cond_broadcast
00000036b880c250 t __pthread_cond_broadcast_2_0
00000036b880bee0 T pthread_cond_broadcast@@GLIBC_2.3.2
00000036b880c250 T pthread_cond_broadcast@GLIBC_2.2.5
所以问题是:
- 为什么
gold和旧的/正常的ld之间的行为不同。 - 当二进制文件链接到未版本化的
pthread_cond_broadcast符号时,在情况 2 中运行时使用了哪个 pthread_cond_broadcast 符号。 pthread_cond_broadcast 的最新实现?最古老的?
这是使用 gcc 4.9.2 和 binutils 2.24 中的 gold/ld 链接器(作为 Red Hat 的 devtoolset-3 的一部分。)
【问题讨论】:
标签: c linux gcc glibc binutils