1. 历史背景
现如今、软件大多自带共享库、或者出于安全、或者基于商业考量。
ld.so:共享库加载器
2. 意义
Linux环境变量名,指定查找共享库(动态链接库)时除了默认路径之外的其他路径。(该路径在默认路径之前查找)。
3. 剖析
.so文件的管理和加载由ld.so负责、在标准路径/lib 或 /usr/lib 里查找APP所需的.so、
但对于非标路径:
Linux做法是把私有路径加入/etc/ld.so.conf、运行ldconfig生成ld.so.cache、ld.so会去查找这个cache
UNIX作风则是采用LD_LIBRARY_PATH来处理非标路径的.so文件
查找优先级如下(Linux):
1)LD_LIBRARY_PATH 环境变量指定目录
2)/etc/ld.so.conf指定目录
3)标准路径 先/usr/lib 再 /lib
4. 常见错误
error while loading shared libraries:ooxx.so.0:cannot open shared object file:No such file or directory
参见: 设置linux的LD_LIBRARY_PATH
5. 通用的方案
1)将这些自带库cp到/usr/lib或/lib、然后ldconfig
2)/etc/ld.so.conf 、然后ldconfig
3)LD_LIBRARY_PATH(这个变量有些遭人诟病)
补充:
查看某程序所依赖的共享库的方法如下:
[root@cdio ~]# ldd /home/mysql/mysql/bin/mysqldump
libpthread.so.0 => /lib64/libpthread.so.0 (0x000000337d200000)
libz.so.1 => /usr/lib64/libz.so.1 (0x000000337e600000)
librt.so.1 => /lib64/librt.so.1 (0x000000337d600000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000337c600000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000031ebe00000)
libm.so.6 => /lib64/libm.so.6 (0x000000337da00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000031e9e00000)
libc.so.6 => /lib64/libc.so.6 (0x000000337c200000)
/lib64/ld-linux-x86-64.so.2 (0x000000337be00000)
输出可分三列解释:
第一列:程序所依赖的库
第二列:系统提供的与程序所需的库的对应库
现如今、软件大多自带共享库、或者出于安全、或者基于商业考量。
ld.so:共享库加载器
2. 意义
Linux环境变量名,指定查找共享库(动态链接库)时除了默认路径之外的其他路径。(该路径在默认路径之前查找)。
3. 剖析
.so文件的管理和加载由ld.so负责、在标准路径/lib 或 /usr/lib 里查找APP所需的.so、
但对于非标路径:
Linux做法是把私有路径加入/etc/ld.so.conf、运行ldconfig生成ld.so.cache、ld.so会去查找这个cache
UNIX作风则是采用LD_LIBRARY_PATH来处理非标路径的.so文件
查找优先级如下(Linux):
1)LD_LIBRARY_PATH 环境变量指定目录
2)/etc/ld.so.conf指定目录
3)标准路径 先/usr/lib 再 /lib
4. 常见错误
error while loading shared libraries:ooxx.so.0:cannot open shared object file:No such file or directory
参见: 设置linux的LD_LIBRARY_PATH
5. 通用的方案
1)将这些自带库cp到/usr/lib或/lib、然后ldconfig
2)/etc/ld.so.conf 、然后ldconfig
3)LD_LIBRARY_PATH(这个变量有些遭人诟病)
补充:
查看某程序所依赖的共享库的方法如下:
[root@cdio ~]# ldd /home/mysql/mysql/bin/mysqldump
libpthread.so.0 => /lib64/libpthread.so.0 (0x000000337d200000)
libz.so.1 => /usr/lib64/libz.so.1 (0x000000337e600000)
librt.so.1 => /lib64/librt.so.1 (0x000000337d600000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000337c600000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000031ebe00000)
libm.so.6 => /lib64/libm.so.6 (0x000000337da00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000031e9e00000)
libc.so.6 => /lib64/libc.so.6 (0x000000337c200000)
/lib64/ld-linux-x86-64.so.2 (0x000000337be00000)
输出可分三列解释:
第一列:程序所依赖的库
第二列:系统提供的与程序所需的库的对应库
第三列:库加载的开始地址