分类:
2010-08-26 13:01:48
1.Linux
1、运行时,动态库的装载依赖于ld-linux.so.6的实现,它查找共享库的顺序如下:
(1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看
(2)ld-linux.so.6缺省在/usr/lib和lib中搜索;当glibc安装到/usr/local下时,它查找/usr/local/lib
(3)LD_LIBRARY_PATH环境变量中所设定的路径
(4)/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中所指定的路径,由ldconfig生成二进制的ld.so.cache中
2、编译时,搜索库的路径顺序如下:
(1)ld-linux.so.6由gcc的spec文件中所设定
(2)gcc --print-search-dirs所打印出的路径,主要是libgcc_s.so等库。可以通过GCC_EXEC_PREFIX来设定
(3)LIBRARY_PATH环境变量中所设定的路径,或编译的命令行中指定的-L/usr/local/lib
(2)binutils中的ld所设定的缺省搜索路径顺序,编译binutils时指定。(可以通过“ld --verbose | grep SEARCH”查看)
2.Hp-ux
1.运行时,/usr/lib/dld.sl (32-bit) 或 /usr/lib/pa20_64/dld.sl (64-bit )
(1)搜索应用库默认路径/usr/local/lib and /usr/contrib/lib (32-bit mode) 或/user/local/lib/pa20_64 and /usr/contrib/lib/pa20_64 (64-bit mode) 和系统库默认路径/usr/lib (32-bit mode) or /user/lib/pa20_64 (64-bit mode)
(2)搜索链接时动态库的目录.对在工作目录链接的动态库(32bit:搜索绝对路径,64bit搜索当前运行路径)
(3)搜索链接时+b 选项参数传入路径(hp-ux 9.0以后版本)
(4)链接时+s选项参数设置时,搜索SHLIB_PATH环境变量的路径,64-bit 还搜索LD_LIBRARY_PATH环境变量路(hp-ux 9.0以后版本)
2.编译时,搜索库的路径顺序如下:
(1) aCC -L 选项参数 传入路径,或-p 参数指定搜索路径/usr/lib/libp
(2) 先搜索环境变量 LPATH ,没有时搜索默认路径 32-bit libraries are located in /usr/lib and /usr/ccs/lib. 64-bit libraries are located in /usr/lib/pa20_64.
3.AIX
1.运行时,load或exec
(1) 搜索 L_LIBPATH_EXEC环境变量
(2)搜索LibraryPath 参数(null string表示当前目录)指定路径,如果LibraryPath 参数未设置搜索LIBPATH,如果LIBPATH未设置搜索LD_LIBRARY_PATH
(3)搜索程序(或加载的共享库)load section 的搜索路径。使用dump -H <程序名> 查看程序load section 搜索路径
2.编译时,搜索库的路径顺序如下:
(1)搜索 -L标志 指定的路径
(2)搜索命令行中-l 指定的库时不使用LIBPATH,和-blibpath选项参数指定的路径
(3)程序load section 的搜索路径内容: -blibpath选项覆盖所有-L标记的内容,-L标志 和-blibpath选项都没有指定时,使用LIBPATH(没有LIBPATH环境变量时,使用缺省路径/usr/lib:./lib),只使用-L标志时为-L标志指定的路径和/usr/lib:./lib
4.Solaris
1.运行时,
(1)如果存在LD_LIBRARY_PATH(32-bit)或LD_LIBRARY_PATH_64(覆盖LD_LIBRARY_PATH),LD_LIBRARY_PATH(64-bit)环境变量,搜索对应路径
(2) 如果编译时包含LD_RUN_PATH环境变量或设置-R 参数(-R 覆盖LD_RUN_PATH),搜索对应指定的路径
(3)如果编译时未设置-z nodefaultlib 参数,搜索/usr/lib (32-bit)或/usr/lib/sparcv9 (64-bit SPARC)
(4)ldd /usr/bin/cat或 dump -Lvp /usr/bin/cat 查看依赖的共享库
2.编译时,搜索库的路径顺序如下:
(1)如果LD_LIBRARY_PATH环境变量存在,搜索(';'分隔)第一个路径列表(':'分隔)
(2)搜索-L标志指定的路径
(3)如果LD_LIBRARY_PATH环境变量存在,搜索(';'分隔)第二个路径列表(':'分隔)
(4)如果-Y选项参数未设置,搜索默认路径/usr/ccs/lib 和 /usr/lib (32-bit), /usr/lib/sparcv9 (64-bit SPARC)
(5)对于64-bit SPARC,LD_LIBRARY_PATH_64 覆盖 LD_LIBRARY_PATH