1

上下文:我目前正在调试一个问题,即在一台机器上生成的二进制文件(与 lpthread 一样)在另一台机器上尝试时会导致与 pthread 相关的错误。

libtest.so 是一个共享库,它似乎包含多个版本的 GLIBC_ 。这是预期的吗?它是怎么发生的?它是使用“-shared -lpthread -fPIC -soname=xxxx”选项链接的。

$objdump -T libtest.so | grep GLIBC_

... 
00000000      DF *UND*  0000008d  GLIBC_2.1   popen
...
00000000      DF *UND*  0000002c  GLIBC_2.0   syslog
00000000      DF *UND*  00000020  GLIBC_2.0   pthread_exit
00000000      DF *UND*  0000009f  GLIBC_2.0   __xstat
00000000      DF *UND*  000000bb  GLIBC_2.3.2 pthread_cond_signal
00000000      DF *UND*  000000c9  GLIBC_2.0   vsprintf
...
4

2 回答 2

4

每个符号都有自己的历史。

当一个符号没有被修改(签名、行为)时,它保持默认版本,例如。GLIBC_2.0。修改的符号归属于当时库的当前版本,例如在 GLIBC_2.1 中修改了 popen() 行为,在 GLIBC_2.3.2 中修改了 pthread_cond_signal()。

您的程序与每个符号的最新版本链接。版本被记录下来,如果您针对较新的 GLIBC 运行程序,您的程序将不会使用较新的符号版本,而是在链接时可用的版本:这确保在运行时具有预期的行为:不足为奇。

于 2012-06-21T13:34:48.157 回答
0

那是因为这些方法存在于不同的 .so 中。glibc 是 .so 的集合。我相信pthread_exit是在libpthread.so并且popen是在libc.so

于 2012-06-21T13:25:34.850 回答