应用程序名称:/lib/libc.so.6:找不到版本“GLIBC_2.8”(应用程序名称需要)

问题描述 投票:0回答:2

命令的输出:

ldd -v appname

linux-gate.so.1 =>  (0x00949000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00cea000)
libm.so.6 => /lib/libm.so.6 (0x00a83000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00ba1000)
libc.so.6 => /lib/libc.so.6 (0x0015c000)
/lib/ld-linux.so.2 (0x0012f000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00b93000)

Version information:
appname:
    libm.so.6 (GLIBC_2.0) => /lib/libm.so.6
    libc.so.6 (GLIBC_2.8) => not found
    libc.so.6 (GLIBC_2.2) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.3.2) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.7) => not found
    libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
    libc.so.6 (GLIBC_PRIVATE) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.1) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.2.4) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
    libstdc++.so.6 (CXXABI_1.3) => /usr/lib/libstdc++.so.6
    libstdc++.so.6 (GLIBCXX_3.4.5) => /usr/lib/libstdc++.so.6
    libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib/libstdc++.so.6
    libpthread.so.0 (GLIBC_2.2) => /lib/libpthread.so.0
    libpthread.so.0 (GLIBC_2.1) => /lib/libpthread.so.0
    libpthread.so.0 (GLIBC_2.0) => /lib/libpthread.so.0
    libpthread.so.0 (GLIBC_2.3.2) => /lib/libpthread.so.0
/lib/libpthread.so.0:
    ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.1) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.3.2) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.2) => /lib/libc.so.6
    libc.so.6 (GLIBC_PRIVATE) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
/lib/libm.so.6:
    ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
/usr/lib/libstdc++.so.6:
    ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
    libgcc_s.so.1 (GCC_4.2.0) => /lib/libgcc_s.so.1
    libgcc_s.so.1 (GLIBC_2.0) => /lib/libgcc_s.so.1
    libgcc_s.so.1 (GCC_3.3) => /lib/libgcc_s.so.1
    libgcc_s.so.1 (GCC_3.0) => /lib/libgcc_s.so.1
    libc.so.6 (GLIBC_2.3.2) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.1) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.2) => /lib/libc.so.6
/lib/libc.so.6:
    ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
/lib/libgcc_s.so.1:
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.2.4) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6

appname
在Ubuntu 9.10上编译,尝试在Centos 5上运行编译后的产品。

我的猜测是Centos5的

/lib/libc.so.5
提供了最高版本的GLIBC_2.4,但是appname调用的是GLIBC_2.8。

但有趣的是。直到我开始链接boost的系统库时,这个问题才发生。之前只是boost的线程库,现在我需要线程和系统。 我在 Ubuntu 系统上编译了 boost。 我现在将尝试在 CentOs 上编译 boost,并带来生成的 .a 文件。 顺便说一句,我正在链接到 boost .a 文件。

问题,如何通过版本控制来减少这些类型的麻烦? 是否有人使用任何技巧,例如使用较低的库版本设置 chroot 环境,以便在其中编译产品? 显然,在较新的 Linux 发行版上进行编译很快就会使您的产品与哪怕是最旧版本的 Linux 都不兼容。 人们如何发布具有良好兼容性的二进制文件? 是的,我可以静态链接,但是libc不能静态链接,对吗?

linux gcc linker symbols glibc
2个回答
2
投票

使用 chroot 环境是实现此目的的一种方法,但您不需要所有这些工作。您可以在某处设置较旧的 SDK 参考版本(包括 libc 和其他版本),然后强制 gcc 链接到该版本,而不是标准系统目录中的库和标头。 GCC 执行此操作的选项包括:

-isystem
-isysroot
--sysroot

举个例子,Apple 的 gcc 经常这样做,根据您的目标操作系统版本链接到各种 SDK 版本。


1
投票

实际上,我遇到了类似的问题

/usr/lib/libc.so.6: version 'GLIBC_2.33' not found

这是因为有新版本的 Glibc 可用。要解决此问题,您需要升级 Glibc 版本。

pacman -Sy // update your repo
pacman -S glibc lib32-glibc
© www.soinside.com 2019 - 2024. All rights reserved.