如何在编译时删除 `GLIBC_2.27' 要求?

how do I remove `GLIBC_2.27' requirement at compile time?

我一直在使用 docker 图像进行 C++ 编译。它基于 Ubuntu 18.04。当我尝试在某些 Ubuntu 16 系统上 运行 时,我收到此消息:

/lib/x86_64-linux-gnu/libm.so.6:找不到版本“GLIBC_2.27”

我将 post 下面是完整的 ldd 输出。我喜欢使用更新的编译器。我宁愿不使用较旧的 Linux 基础映像进行编译(但如有必要,我会这样做)。我静态 link 大多数库,但我还没有静态 linking glibc。许多网络资源建议不要这样做。有什么方法可以告诉我较新的编译器 (gcc 7.3) 不需要较新的 glibc? ldd -v 输出:

    linux-vdso.so.1 (0x00007ffd167cf000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007eff77399000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007eff77191000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007eff76df3000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007eff76bdb000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007eff767ea000)
    /lib64/ld-linux-x86-64.so.2 (0x00007eff79f90000)

    Version information:
    lbrycrd-linux (4)/lbrycrdd:
        ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
        librt.so.1 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/librt.so.1
        libm.so.6 (GLIBC_2.27) => /lib/x86_64-linux-gnu/libm.so.6
        libm.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libm.so.6
        libgcc_s.so.1 (GCC_3.3) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libgcc_s.so.1 (GCC_3.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libgcc_s.so.1 (GCC_4.2.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libpthread.so.0 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.3.3) => /lib/x86_64-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libpthread.so.0
        libc.so.6 (GLIBC_2.15) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.8) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.9) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.10) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libpthread.so.0:
        ld-linux-x86-64.so.2 (GLIBC_2.2.5) => /lib64/ld-linux-x86-64.so.2
        ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/librt.so.1:
        libpthread.so.0 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libpthread.so.0
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libm.so.6:
        ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libgcc_s.so.1:
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libc.so.6:
        ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
        ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2

您需要针对较旧的 glibc 版本进行构建。很少有发行版(如果有的话)开箱即用地支持它。目前唯一可行的方法是在较旧的发行版上构建。

一些支持周期较长的发行版提供较新的 GCC 版本,不需要较新的系统编译器(例如 Developer Toolset,可用于 CentOS and Red Hat Enterprise Linux)。

我遇到了同样的问题。

/lib/i386-linux-gnu/libm.so.6: version `GLIBC_2.27' not found (required by your_lib.so) 

在网上搜索后,我发现了一些可能有用的 link。

静态link: Link 与 -static。参见 How can I link to a specific glibc version?

使用 docker: 请参阅

专有解决方案:参见https://github.com/wheybags/glibc_version_header

我决定跟着第一个。所以我为 your_lib.so 创建了一个静态库,并 link 用我的二进制文件静态编辑它。

尝试symbol versioning,例如:

__asm__(".symver old_foo,foo@VERS_1.1");

相关问题: