动态库加载机制
Linux操作系统中对于动态链接库都是利用ld-linux.so.2去加载的,加载过程如下:
总体来说,就是在加载一个动态库之前会按照ELF文件格式,去读取这个动态库还依赖的动态库,并读取动态库搜索路径(如果这个RPATH存在),并以该搜索路径为起点,依次搜索LD_LIBRARY_PATH,/etc/ld.so.conf中指定的路径,最后到/lib或者/lib64中去搜索,在其中任意一个位置搜索到后完成依赖库的加载后便返回。
动态库搜索路径指定
只需要在编译生成动态库的连接选项中增加-rpath选项即可,多个搜索路径以::分隔,以CodeBlocks平台为例,如下所示:
其格式为:-Wl,-rpath=serch path1: serch path2
加入该选项后,最终执行的链接命令最终的编译指令就是:
gcc test.c -lhello -L . -Wl,-rpath serch path1: serch path2
在编译生成共享库后就会将serch path1和serch path2写入对应的.dynamic节中。
2. 通过LD_LIBRARY_PATH指定搜索路径
可以通过echo $ LD_LIBRARY_PATH查看当前的LD_LIBRARY_PATH
若临时性的指定,可以执行命令来增加一个路径/tmp:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp
若需要持久性地增加一个路径/tmp,可修改~/.bashrc或~/.bash_profile或系统级别的/etc/profile等文件,在其文件中增加:
export LD_LIBRARY_PATH=/tmp:$LD_LIBRARY_PATH
然后保存改文件,并执行
source .bashrc 或者source .bash_profile或者source/etc/profile
修改了哪个文件对改文件执行source生效。
3. 通过/etc/ld.so.conf指定搜索路径
打开该文件在其中增加需要指定的路径如: /tmp
4. 将动态库拷贝至/lib或者/lib64下