如何强制 /usr/bin 中的程序始终使用 /usr/lib 中的库

如何强制 /usr/bin 中的程序始终使用 /usr/lib 中的库

我正在努力解决 Fedora 26 上的路径问题。我正在构建更新的程序和库并将它们放在/usr/local.程序/usr/local/bin使用 中的库/usr/local/lib。由于目前未知的原因,gawk位于 的Fedora 26/usr/bin/gawk正在使用位于 的库/usr/local/lib

该库/usr/local/lib与预期不兼容gawk,因此它破坏了我的脚本。或者更正确地说,我的脚本调用 Autotools,然后即使路径没有混乱,Autotools 也会中断。有关背景问题的更多信息,请访问libreadline.so.7:未定义符号:UP在堆栈溢出上。

我想强制执行一项政策,其中的任何程序/usr/bin都必须链接到/usr/lib.我不关心混合或插入。如果我需要这样做,那么我将从源代码构建包并将其安装到/usr/local.

其他操作系统很久以前就通过install_namesOS X 和 Windows 上的清单等解决了这个问题。 Linux 只是允许同样的问题恶化(我认为--enable-new-dtags这是不能解决问题的最新创可贴)。

如何强制程序/usr/bin链接到 中的库/usr/lib

答案1

您可以通过指定动态部分来覆盖可执行文件中的搜索路径 DT_RUNPATH。看ld.so 手册页。使用标准位置应该是常态,并且应该通过为链接器添加以下 gcc 选项来链接要/usr/lib使用库的(希望不是太多)程序:/usr/local/lib

gcc ... -Wl,-rpath,/usr/local/lib -Wl,--enable-new-tags ...

答案2

export LD_LIBRARY_PATH=/usr/lib

或者直接运行命令:

LD_LIBRARY_PATH=/usr/lib gawk

您可以在中配置默认​​搜索顺序/etc/ld.so.conf

答案3

当手动编译系统中已经存在的库时,无论它们去哪里,最新/usr/lib的安装优先。库路径在 /etc/ld.so.conf 中指定,而 /etc/ld.so.conf 又读取.您可以在那里创建一个新文件,其中包含您想要的任何库的路径,然后在完成后运行。/usr/lib64/usr/local/lib/usr/local/lib64/etc/ld.so.conf.dldconfig

或者,在脚本中,您可以使用LD_LIBRARY_PATH环境变量设置自己的库路径。这将强制脚本采用其中指定的任何库路径。可以提供用分号分隔的多个路径。

相关内容