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


29

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

  $ 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(因为构建工具非常复杂)
  • 更改任何全局设置(因为其他开发人员在此计算机上工作)

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

Answers:


22

您可以暂时将其他库替换为该特定执行。在Linux中,环境变量LD_LIBRARY_PATH是用冒号分隔的目录集,在其中应首先搜索库,然后再搜索标准目录集;这在调试新库或出于特殊目的使用非标准库时很有用。正如/etc/ld.so.preload一样,环境变量LD_PRELOAD列出了具有覆盖标准集的功能的共享库。- 共享库

您还可以直接调用加载程序:

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


1
LD_LIBRARY_PATH不会覆盖默认搜索路径。我设置了它,但ldd仍然显示了系统默认路径,而不是覆盖的默认路径。尽管我可以通过设置LD_PRELOAD来强制加载自己的库。
Calmarius

18

编写一个设置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,它使您可以编辑可执行文件中包含的库搜索路径。


2
为+1 chrpath。正是我所需要的。
拉格夫房车

可爱的故事,微软太傻花2分钟谷歌搜索这一点,并劝告大家使用LD_LIBRARY_PATH,而不是连接SQL Server以openss-1.0.0明确或重新编译以openssl.so版本blogs.msdn.microsoft.com/sql_server_team /…
埃文·卡罗尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.