您的当前位置:首页正文

Linux动态库加载研究

2024-11-12 来源:个人技术集锦

        动态库加载机制

         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

 

 

显示全文