更改给定可执行文件的链接库 (CentOs 6)

Fix*_*xee 33 libraries linker

我有一个像这样链接的可执行文件:

  $ ldd a.out
        libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.
Run Code Online (Sandbox Code Playgroud)

其中 libcrypto 和 libssl 库是 openssl 1.0.0-fips 库。我想尝试使用 1.0.1 库,因此我将它们构建在我的主目录中。有没有办法在a.out没有很多痛苦的情况下重新链接我的新 openssl 库?我想避免

  • 必须重新链接a.out(因为构建工具非常复杂)
  • 改变任何全局设置(因为其他开发人员在这台机器上工作)

有可能在这里做我希望的事情吗?

Dav*_*rtz 24

您可以为这个特定的执行临时替换一个不同的库。在 Linux 中,环境变量 LD_LIBRARY_PATH 是一组以冒号分隔的目录,应该在标准目录集之前首先搜索库;这在调试新库或出于特殊目的使用非标准库时非常有用。环境变量 LD_PRELOAD 列出了具有覆盖标准集的函数的共享库,就像 /etc/ld.so.preload 一样。-共享库

你也可以直接调用加载器:

/lib/ld-linux.so.2 --library-path path executable


Gil*_*il' 23

编写一个设置LD_LIBRARY_PATH环境变量的包装脚本。这是PATH共享库的挂件。系统搜索路径总是在 中列出的目录之后搜索$LD_LIBRARY_PATH。请参阅动态链接器手册以供参考。

#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"
Run Code Online (Sandbox Code Playgroud)

或者,一次性,直接在命令行上:

LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out
Run Code Online (Sandbox Code Playgroud)

或者,如果您想修改二进制文件,请尝试chrpath,它允许您编辑在可执行文件中烘焙的库搜索路径。

  • +1 表示`chrpath`。正是我需要的。 (3认同)
  • @RoelVandePaar 我认为 `chrpath` 只能编辑现有的 rpath,如果不存在则不能添加。[此线程](/sf/ask/963839901/#20333550)建议“patchelf”可以添加rpath。我没试过。 (2认同)