为什么设置LD_LIBRARY_PATH会更改共享库依赖项?

时间:2016-03-16 17:06:17

标签: gcc shared-libraries ldd

我有一个简单的hello_world.cpp程序。我在CentOS 6.6系统上使用g ++ 4.4.7编译它。当我查看ldd a.out时:

linux-vdso.so.1 =>  (0x00007fffbd79e000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002ab6f6819000)
libm.so.6 => /lib64/libm.so.6 (0x00002ab6f6b1f000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002ab6f6da4000)
libc.so.6 => /lib64/libc.so.6 (0x00002ab6f6fba000)
/lib64/ld-linux-x86-64.so.2 (0x00002ab6f65f7000)

当我为gcc-4.9.2加载模块时,LD_LIBRARY_PATH设置为/path/to/gcc-4.9.2/lib64并运行ldd a.out会产生:

linux-vdso.so.1 =>  (0x00007ffff9393000)
libstdc++.so.6 => /path/to/gcc-4.9.2/lib64/libstdc++.so.6 (0x00002b2b7c104000)
libm.so.6 => /lib64/libm.so.6 (0x00002b2b7c435000)
libgcc_s.so.1 => /path/to/gcc-4.9.2/lib64/libgcc_s.so.1 (0x00002b2b7c6b9000)
libc.so.6 => /lib64/libc.so.6 (0x00002b2b7c8cf000)
/lib64/ld-linux-x86-64.so.2 (0x00002b2b7bee2000)

问题:为什么设置LD_LIBRARY_PATH时使用4.9.2版本的gcc库,即使我用4.4.7编译?

这似乎造成了一个问题,即知道正在使用哪个版本的库。用户可以使用一个编译器版本编译程序,加载不同的编译器版本(通过模块),然后运行使用与预期不同的库版本的可执行文件。

1 个答案:

答案 0 :(得分:0)

我不知道您是否知道使用Environment Modules 不是使用GCC,甚至使用GCC的多个版本的必要或正常部分。

设置LD_LIBRARY_PATH以覆盖系统动态链接器的默认目录搜索顺序 这是一种漫长而大声谴责的做法,其原因包括: 在你的帖子的最后一段中表达的一个。参见例如Gurus say that LD_LIBRARY_PATH is bad

在为使用多个版本的工具或工具链而定制的系统中的环境模块中执行此操作 可被视为危险做法的受管制应用。然而,在这种背景下, 在您的gcc-4.9.2环境模块中设置LD_LIBRARY_PATH正在做什么 这样的设置应该做:覆盖 动态链接器的默认目录搜索顺序。请参阅the documentation: 3.3.1

原则上,有可能编译一个程序并与旧的或 如果您选择在GCC中运行它,GCC的更高版本会出现意外行为 gcc-4.9.2模块的环境。环境模块是一个利基便利, 他们有这种风险。虽然如果你在本机中构建程序 环境,或者特别是在gcc 4.4.7的模块启用环境中 在gcc-4.9.2环境中运行它的风险可能是一个 你不必采取。