Linux下的动态共享链接库的分析与使用
动态共享库的工作方式与静态链接库不同.对于每个使用静态链接库的应用程序而言,在应用程序中都存在着静态链接库拷贝.但是动态共享库却不是这样的,动态共享库是被所有使用它的应用程序共享的,无论调用一个动态共享库的进程有多少,系统中始终只运行着一个动态共享库,这里动态共享库中“共享”的含义.至于“动态”,则主要强调的是链接发生在什么阶段.对于静态链接库而言,链接过程发生在编译阶段,操作系统在加载程序时不再对程序做任何改变,因此“静态”链接;然而对于使用动态共享库的程序而言,编译器在编译程序时只知道程序 将要使用到某个动态共享库中的某个符号.至于这个符号所对应的具体实体,在编译时则是未知的.从符号转换为实体的工作留给了操作系统在加载程序时支完成.这样一个转换过程实质上就是把程序的链接过程推迟到了程序执行时来完成.这与在编译期间完成链接雷管显然是不一样的.这也是动态共享库被冠以“动态”的原因. 动态共享库有以下的优点,使它在Linux开发中比静态链接库更加的流行. (1) 节省内存 动态共享库无论被多少应用程序使用,在内存中都只存在一个动态共享库的副本,而不像静态链接库那样,一个应用程序在运行中用到静态链 接库,就会有多个静态链接库的副本 . (2) 节省磁盘 这和节省内存有点相似,同样这也是 (3) 便于软件修复与升级 (4) 提高性能 与采用静态链接库臃肿的应用程序相比,采用动态共享库的应用程序明显“苗条”得多,这样当操作系统加载应用程序时,是需要把应用程序 复制到内存中的,这样的“苗条”的动态链接库也就有了很大的优势,同时提高了程序的性能. 当然,动态链接库在有上述这些优势的同时,也有以下的几个劣势.复杂性,兼容性,调试困难.但是它在Linux上使用频率上仍然比静态链接库要高的多.应用的更加广泛. 动态共享库的重要概念-----soname 动态共享库有一个重要的概念---soname.动态共享库在Linux系统上是以文件的形式存在的,这样,每个动态共享库也就有一个文件名,假设把动态共享库的文件名定义为filename.那么 然而,应用程序并不是直接和名字为soname的文件相链接的.比如,对于Linux C库而言,尽管通常在系统中能够找到名为libc.so.6的文件,但这个文件实际上却只是一个软连接也就是符号链接.这里清楚地显示出libc.so.6是一个到libc-2.3.2.so的软连接.那么,这个软连接是由ldconfig建立的.ldconfig做的事情就是配置动态链接器的运行时绑定.对于一个编译好的动态链接库,如何知道它的soname是什么呢?可以使用readelf.readelf有一个选项-d,这个选项可以打印出ELF文件中dynameic段的内容.在ELF中的dynamic段中就包含着动态共享库的soname.在Linux系统中存在着一个文件 /etc/ld.so.conf.这个文件中的每 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |