可执行文件没有链接到我想要的动态库

问题描述

我使用“https://www.mpich.org/static/downloads/3.4.1/mpich-3.4”中给出的步骤从源代码 (mpich-3.4.1.tar.gz) 构建并安装了 mpich .1-README.txt'。我希望生成的可执行文件动态链接到路径“/home/myname/mylibs”中指定的库。因此,在调用 ./configure 之前,我已将 LD_LIBRARY_PATH 设置为: setenv LD_LIBRARY_PATH /home/myname/mylibs:$LD_LIBRARY_PATH

在目录“/home/myname/mylibs”内,我将“libc.so.6”和“libstdc++.so.6”软链接到我想要的库,因为我不希望生成的可执行文件链接到动态来自路径 /lib64/ 的库。我能够在我的机器上构建和安装 mpich。但是,当我对生成的其中一个可执行文件 (hydra_pmi_proxy) 调用“ldd”时,我看到以下内容

$ ldd /home/myname/mpich-3.4.1_install/bin/hydra_pmi_proxy

libc.so.6 => /lib64/libc.so.6 (0x00007f32f9eef000)

libstdc++.so.6 => /home/myname/mylibs/libstdc++.so.6 (0x00007f32f9542000)

rpath 似乎设置为我想要的路径“/home/myname/mylibs”,如下所示:

$ readelf -d /home/myname/mpich-3.4.1_install/bin/hydra_pmi_proxy | egrep "RPATH|RUNPATH"

0x000000000000000f (RPATH) Library rpath: [/home/myname/mylibs]

如上所示,libstdc++.so.6 指向我想要的库,但 libc.so.6 仍然指向 /lib64/libc.so.6。我希望 libc.so.6 指向 /home/myname/mylibs/libc.so.6 有什么我可以做的事情吗?

我不希望我的 exe 动态链接/lib64/ 中的库,因为当我在多台机器上启动我的 MPI 程序时,“hydra_pmi_proxy”似乎试图动态链接/lib64/libc.so.6运行某个进程的机器。 (最有可能的是,它在新机器上生成一个子进程,该子进程又动态链接到该机器的 /lib64/libc.so.6)。我已经看到,当其中一个 mpi 进程尝试在 /lib64/libc.so.6 指向旧版本的任何机器上运行时,我收到错误消息。错误是: /home/myname/mpich-3.4.1_install/bin/hydra_pmi_proxy: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by /home/myname/mpich-3.4.1_install/bin/hydra_pmi_proxy)。 当我登录到这台失败的机器并执行 strings /lib64/libc.so.6 | grep GLIBC_2 时,我没有看到 GLIBC_2.17 列出。然而,在 mpi 进程成功运行的所有其他机器上,我看到 GLIBC_2.17 列在运行“字符串”上。因此,我的目的是让所有可执行文件动态链接到仅位于“/home/myname/mylibs/”的库。这是正确的方法吗?

解决方法

我不希望生成的可执行文件从路径 /lib64/ 链接到动态库

libc.so.6 是一个特例。请参阅 this answer 了解原因。

如果您真的想将您的二进制文件与 /lib64/... 中的库隔离,您必须:

  1. 配置构建并安装到 /home/myname/mylibs/ 新版本的 GLIBC(符号链接是不够的)和
  2. 将您的 --dynamic-linker--rpath 设置为指向 mylibs

也就是说,您没有解释为什么您不想链接来自 /lib64 的库。 http://xyproblem.info 可能与此处相关。