有专门做摄影画册的网站吗,2022年西安封城通知,wordpress注册邮箱验证码,icp网站快速案文章目录 1.动态链接库简介2.动态库搜索路径3.运行时链接及搜索顺序4.查看可运行模块的链接库5.总结 1.动态链接库简介
动态库又叫动态链接库#xff0c;是程序运行的时候加载的库#xff0c;当动态链接库正确安装后#xff0c;所有的程序都可以使用动态库来运行程序。动态… 文章目录 1.动态链接库简介2.动态库搜索路径3.运行时链接及搜索顺序4.查看可运行模块的链接库5.总结 1.动态链接库简介
动态库又叫动态链接库是程序运行的时候加载的库当动态链接库正确安装后所有的程序都可以使用动态库来运行程序。动态库是目标文件的集合目标文件在动态库中的组织方式是按特殊的方式组织形成的。在动态库中函数和变量的地址是相对地址而不是绝对地址其真实地址在调用动态库的程序加载时形成的。 动态库的名字有别名(soname), 真名realname和链接名linkername。别名是由一个lib前缀然后是库的名字最后以“.so”结尾来构成。真名是动态链接库的真实名字一般总是在别名的基础上添加一个版本号信息。除此之外还有一个链接名他是在程序链接的时候使用的名字。 动态库安装的时候总是复制库文件到某一个目录然后使用一个软链接生成一个别名在库文件更新的时候仅仅更新软链接即可。
2.动态库搜索路径 仅对ELF格式如果可执行文件包含DT_RPATH标签并且不包含DT_RUNPATH标签将从DT_RPATH列出的路径搜索。DT_RPATH已经被废弃请用DT_RUNPATH 如果LD_LIBRARY_PATH在程序运行时被定义那么将从它包含的路径开始。安全起见对于set-user-ID或者set-group-ID的程序这个变量将被忽略。 仅对ELF格式如果可执行文件包含DT_RUNPATH标签将从这个标签列出的路径开始搜索。 从 /etc/ld.so.cache运行ldconfig产生中查找文件 从/lib以及/urs/lib按顺序搜索。如果链接时指定-z nodefaultlib,这个步骤将被忽略。 3.运行时链接及搜索顺序
这个过程是由ld-linux.so程序来执行这个才是真正的链接。它所做的工作就是将动态库的代码映射到进程的虚拟地址空间中供进程来调用。程序在连接时使用了共享库就必须在运行的时候能够找到共享库的位置。linux的可执行程序在执行的时候默认是先搜索/lib和/usr/lib这两个目录然后按照/etc/ld.so.conf里面的配置搜索绝对路径。同时Linux也提供了环境变量LD_LIBRARY_PATH供用户选择使用用户可以通过设定它来查找除默认路径之外的其他路径LD_LIBRARY_PATH路径优先于系统默认路径之前查找。
LD_LIBRARY_PATH的设定作用是全局的过多的使用可能会影响到其他应用程序的运行所以多用在调试。通常情况下推荐还是使用gcc的-R或-rpath选项来在编译时就指定库的查找路径并且该库的路径信息保存在可执行文件中运行时它会直接到该路径查找库避免了使用LD_LIBRARY_PATH环境变量查找看到Qt的使用qmake生成的makefile中有gcc -rpath xxx指出程序运行时的一个搜索路径, 或许与qt的QMAKE_RPATHDIR有关
ld-linux.so.x在可执行的目标文件中被指定可用readelf -l命令查看 。 (很多现代应用都是通过动态编译链接的当一个 需要动态链接 的应用被操作系统加载时系统必须要 定位 然后 加载它所 需要的所有动态库文件。 在Linux环境下这项工作是由ld-linux.so.x来负责完成的) 和Windows下的PE文件类似ELF文件是linux系统下可执行文件、动态库文件、静态库文件的标准格式。
例如运行readelf -l 文件名在输出的Headers部分的INTERP部分会指出该可执行文件需要的ld-linux.so。
运行时ld-linux.so 查找共享库的路径: 1编译时使用gcc的-R或-rpath选项指定路径。 2LD_LIBRARY_PATH环境变量中所设定的路径。 3ld-linux.so 缺省在/usr/lib和/lib中搜索当glibc安装到/usr/local下时它查找/usr/local/lib 4/etc/ld.so.conf或/usr/local/etc/ld.so.conf中所指定的路径。 查看/etc/ld.so.conf文件或许只有一行“include /etc/ld.so.conf.d/*.conf ”意味着包括了/etc/ld.so.conf.d/目录下的所有.conf文件每个文件中都写着具体的路径。如果你想加一个运行时的搜索路径可在/etc/ld.so.conf.d目录下新建一个.conf文件里面写上路径注意添加完了之后要在root权限下运行ldconfig指令使其生效该指令更新记录了系统中有哪些so文件的缓存文件/etc /ld.so.cache。
4.查看可运行模块的链接库
可使用ldd指令查看一个可执行文件依赖于哪些库ldd xxx
ldd bashlinux-vdso.so.1是Linux为了解决和glibc兼容而想出的绝招。 原来这个 linux-vdso.so.1 文件并不是一个真实存在的文件而是 Linux 中的一个虚拟文件专门用于将内核中一些常用的函数从内核空间映射到用户空间。也就是说这个文件不用复制。 VDSO就是Virtual Dynamic Shared Object就是内核提供的虚拟的.so这个.so文件不在磁盘上而是在内核里。内核把包含某.so的内存页在程序启动的时候映射入其内存空间对应的程序就可以当普通的.so来使用其提供的函数接口。
5.总结
在linux下的动态链接库并不从程序所在当前目录查找连接库而是从编译时指定目录查找或者默认目录查找。