【发布时间】:2015-08-05 07:55:14
【问题描述】:
在 Windows 中,动态加载器总是首先在加载的可执行文件的路径中查找模块,从而可以在不影响系统库的情况下拥有私有库。
Linux 上的动态加载器仅在固定路径中查找库,因为它独立于所选的二进制文件。我需要 GCC 5 的溢出检查算术函数,但由于 C++ ABI 在 4.9 和 5 之间发生了变化,一些应用程序变得不稳定,重新编译它们解决了这个问题。在等待我的发行版 [kubuntu] 升级默认编译器时,是否可以让新编译的应用程序链接到新的运行时,而打包的应用程序仍然链接到旧库,无论是通过静态链接还是模仿 Windows 行为的东西?
模拟它的一种方法是创建一个包装脚本
#!/bin/bash
LD_LIBRARY_PATH=$(dirname $(which your_file)) your_file
在链接步骤之后复制受影响的库,但这有点像 hack。
【问题讨论】:
-
“Linux 上的动态加载器只查找固定路径中的库”——不,它不会,参见 LD_LIBRARY_PATH。
-
@Mat 是的,但它独立于它加载的图像文件
-
你需要阅读更多关于 Linux 动态链接的内容。
-
@BasileStarynkevitch 我只是认为当前安装的编译器应该不会影响其他应用程序的行为。
-
编译器与此无关。这是一个链接器问题。
标签: linux gcc dynamic-linking libstdc++