gpt4 book ai didi

Linux共享库版本匹配

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:18 25 4
gpt4 key购买 nike

我有2台机器,一台是ubuntu 16.04,安装了libc-2.23。另一个是redhat 7,libc版本是2.17

下面这个简单的程序是在ubuntu上编译的,在redhat 7上可以很好的运行。

#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[])
{
printf("hello world\n");
double n = 4;
printf("%e\n", sqrt(n));
return 0;
}

但是当我在 ubuntu 上编译 mongodb,并将二进制文件传送到 redhat 7 时,我得到以下错误。

[zhifan@rhel-2372970 ~]$ ldd mongod
./mongod: /lib64/libm.so.6: version `GLIBC_2.23' not found (required by ./mongod)
linux-vdso.so.1 => (0x00007ffd4313a000)
libm.so.6 => /lib64/libm.so.6 (0x00007faaf5eb4000)
librt.so.1 => /lib64/librt.so.1 (0x00007faaf5cac000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007faaf5aa7000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007faaf5891000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007faaf5675000)
libc.so.6 => /lib64/libc.so.6 (0x00007faaf52b1000)
/lib64/ld-linux-x86-64.so.2 (0x0000564cf2068000)

所以我的问题是:

  1. 运行二进制文件时,库加载器如何决定它发现可以使用的库(在本例中为 libc)?
  2. 我确定完全相同版本的 mongod(由 mongo inc 构建)可以与 libc-2.17 一起运行,但为什么我的构建不能与 libc-2.17 一起运行?

最佳答案

When running a binary, how library loader decide the library (libc in this case) it found is ok to use?

它查找应用程序所需的符号版本。 IFF 所有必需的符号都可用,那么库就可以使用了。

您可以通过运行 readelf -V a.out 查看需要哪些符号。

why my build can't run with libc-2.17

当您将二进制文件链接到 GLIBC-2.23 时,您可以使用那个版本的符号定义。与早期版本相比,这些符号具有不同的 ABI,因此不能使用早期版本。

为了避免这种情况,您可以要么在旧系统上构建(二进制文件将在新系统上运行得很好——它将使用旧符号 ABI),或者您必须构建一个 Linux-to-较旧的 Linux 交叉编译器(这将使您的二进制文件使用较旧的 ABI)。

关于Linux共享库版本匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50042644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com