【发布时间】:2016-07-01 03:00:50
【问题描述】:
我很难理解搜索目录以链接到库的顺序。我有一个 CentOS6 系统和 3 个版本的 gcc,4.4.7、4.7.2、4.9.2。系统版本为 4.4.7,版本 4.7.2 和 4.9.2 为模块。在 /etc/ld.so.conf.d/ 中有两个文件,gcc-4.7.2.conf 和 gcc-4.9.2.conf,其中包含 4.7.2 和 4.9.2 库的路径。
我创建了一个简单的 C++ 程序,main.cpp
#include <cstdio>
#include <iostream>
using namespace std;
int main(void)
{
cout << "Hello You!" << endl;
printf("Back at you!\n");
return 0;
}
用g++-4.4.7编译并运行ldd a.out,我明白了
linux-vdso.so.1 => (0x00007fff5535b000)
libstdc++.so.6 => /nonstandardpath/gcc-4.7.2/lib64/libstdc++.so.6 (0x00002ac12de73000)
libm.so.6 => /lib64/libm.so.6 (0x00002ac12e17a000)
libgcc_s.so.1 => /nonstandardpath/gcc-4.7.2/lib64/libgcc_s.so.1 (0x00002ac12e3ff000)
libc.so.6 => /lib64/libc.so.6 (0x00002ac12e614000)
/lib64/ld-linux-x86-64.so.2 (0x00002ac12dc51000)
看着man ld,它说(在-rpath-link=dir下):
链接器使用以下搜索路径来定位所需的共享 图书馆:
-rpath-link 选项指定的任何目录。
-rpath 选项指定的任何目录。 -rpath 和 -rpath 的区别 -rpath-link 是由 -rpath 选项指定的目录包含在 可执行并在运行时使用,而 -rpath-link 选项仅在 链接时间。只有本机链接器支持以这种方式搜索 -rpath,并且 已使用 --with-sysroot 选项配置的交叉链接器。
在 ELF 系统上,对于本机链接器,如果没有 -rpath 和 -rpath-link 选项 使用,搜索环境变量“LD_RUN_PATH”的内容。
在 SunOS 上,如果未使用 -rpath 选项,则搜索使用指定的任何目录 -L 选项。
对于本机链接器,搜索环境变量的内容 “LD_LIBRARY_PATH”。
对于本机 ELF 链接器,共享的“DT_RUNPATH”或“DT_RPATH”中的目录 库被搜索它需要的共享库。 “DT_RPATH”条目是 如果存在“DT_RUNPATH”条目,则忽略。
默认目录,通常是 /lib 和 /usr/lib。
对于 ELF 系统上的本机链接器,如果文件 /etc/ld.so.conf 存在,则列表 在该文件中找到的目录。
如果找不到所需的共享库,链接器将发出警告并 继续链接。
它没有说明搜索目录的顺序。从我上面的例子来看,/etc/ld.so.conf.d 似乎在/usr/lib 或/lib 之前被搜索过
问题:链接器搜索库的顺序是什么(例如 LD_LIBRARY_PATH、ld.so.conf.d、-rpath、-L)?
【问题讨论】: