使用版本化符号链接失败(memcpy& secure_getenv)

时间:2017-01-25 16:19:50

标签: c linux ld glibc

在尝试将共享库与Redhat Linux上的程序链接时,我看到了未定义的符号 我们运行的是Linux内核3.10.0,gcc 4.8.2和libc-2.17.so,以及libblkid 2.23.2

当我构建我正在编写的应用程序时,我从libblkid获​​取了两个未定义的符号:memcpy@GLIBC_2.14secure_getenv@GLIBC_2.17。 (一个非常类似的构建在其他机器上工作,表面上使用相同版本的所有东西)。

注意,对于secure_getenv,libblkid需要与libc库本身相同的版本。

查看libc-2.17.so中定义的符号,我找到memcpy@@GLIBC_2.14memcpy@GLIBC_2.2.5secure_getenvsecure_getenv@GLIBC_2.2.5。根据我的理解,第一个@版本中的双memcpy只是将其标记为默认版本。而且,由于某些原因,即使在带有版本化符号的libc中,第一个secure_getenv似乎也是无版本的。

那么,为什么memcpy@GLIBC_2.14的要求与默认的memcpy@@GLIBC_2.14不匹配?

从逻辑上讲,我希望libc-2.17中的基本版secure_getenv能够满足2.17版的要求。

那么,这里发生了什么?是什么让我的开发机器失败而不是其他?我该如何解决? (由于make在其他机器上工作,这似乎是我的构建环境特有的,但是什么?)

1 个答案:

答案 0 :(得分:0)

您可能已安装compat-glibc,如-L/usr/lib/x86_64-redhat-linux6E/lib64参数所示。 Red Hat Enterprise Linux 7上的compat-glibc仅提供glibc 2.12,因此不能用于链接系统库。