16-在运行时找出共享库
41.11 在运行时找出共享库
在解析库依赖时,动态链接器首先会检查各个依赖字符串以确定它是否包含斜线(/),因为在链接可执行文件时如果指定了一个显式的库路径名的话就会发生这种情况。如果找到了一个斜线,那么依赖字符串就会被解释成一个路径名(绝对路径名或相对路径名),并且会使用该路径名加载库。否则动态链接器会使用下面的规则来搜索共享库。
1. 如果可执行文件的DT_RPATH运行时库路径列表(rpath)中包含目录并且不包含DT_RUNPATH列表,那么就搜索这些目录(按照链接程序时指定的目录顺序)。
2. 如果定义了LD_LIBRARY_PATH环境变量,那么就会轮流搜索该变量值中以冒号分隔的各个目录。如果可执行文件是一个set-user-ID或set-group-ID程序,那么就会忽略LD_LIBRARY_PATH变量。这项安全措施是为了防止用户欺骗动态链接器让其加载一个与可执行文件所需的库的名称一样的私有库。
3. 如果可执行文件DT_RUNPATH运行时库路径列表中包含目录,那么就会搜索这些目录(按照链接程序时指定的目录顺序)。
4. 检查/etc/ld.so.cache文件以确认它是否包含了与库相关的条目。
5. 搜索/lib和/usr/lib目录(按照这个顺序)。