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

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

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

  $ 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)
.
.

其中 libcrypto 和 libssl 库是 openssl 1.0.0-fips 库。我想尝试使用 1.0.1 库,因此我在主目录中构建了它们。有没有办法a.out轻松重新链接到我的新 openssl 库?我想避免

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

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

答案1

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

您还可以直接调用加载器:

/lib/ld-linux.so.2 --库路径path executable

答案2

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

#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"

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

LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out

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

相关内容