加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Ubuntu Linux---GNU libc库

发布时间:2016-01-26 20:41:49 所属栏目:Linux 来源:网络整理
导读:除了libc和libm库,UNIX系统库没有其他标准的命名规范。Linux上的一些系统库可能和UNIX平台上库的名称不同,这就需要知道Linux上各库所包含和支持的功能。表3-2

在Linux上,GNU ld可以使用-version-script连接器选项来创建符号版本化的共享库。编译器选项-Wl,--version-script=mapfile告诉链接器哪些符号要从生成的共享库中输出出来。每个符号分属global(被输出)和local(不被输出)两类中的一种。来看下面的例子。foo.c包含一个函数foo1,该文件用来创建1.1版本的共享库。(见附件 示例代码.pdf)

可以看到,这次main只引用了版本化库的LX_1.1。

GNU ld还允许在定义符号的源文件中把符号绑定到某一版本中,而不仅仅是在脚本文件中指定。另外,GNU ld还允许同一函数的多个版本出现在同一个共享库中。更多详细信息,请参考GNU ld手册(注释13)和Ulrich Drepper的文章“How to Write Shared Libraries”。

从2.1版本开始,glibc就已经实现了符号版本化。符号版本化同时也是LSB规范1.2及更高版本的一部分。

3.5 动态链接器(运行时链接器)

Linux动态链接器(/lib/ld.so.1或/lib64/ld64.so.1)查找和装载应用程序所需的共享库,准备应用程序的运行,然后运行应用程序。除非编译时为ld指明-static选项,否则Linux二进制程序都是动态链接的。

在所有现代UNIX操作系统上,都有一些环境变量可以影响动态链接器的运行。例如AIX上的环境变量LIBPATH可以改变动态链接器的搜索路径。以下环境变量可以影响到Linux上动态链接器的运行:

- LD_LIBRARY_PATH,以冒号分开的目录列表,运行时会在这些目录中查找需要的库。

- LD_PRELOAD,以空格分开的库列表,这些库会在其他所有库之前装载。这常常用来有选择的覆盖某些共享库中的函数。

- LD_BIND_NOW,如果该环境变量设置成非空字符串,动态链接器会在程序启动时解析所有符号,而不是首次引用时才解析符号(也就是常说的“延迟绑定”)。这在使用调试器时非常有用。

- LD_TRACE_LOADED_OBJECTS,如果该环境变量设置成非空字符串,程序会列出它所依赖的共享库,就像运行ldd命令一样,而不是正常的执行。

Linux动态链接器采用广度优先(breadth first)的方式解决库的依赖关系。也就是说,首先是可执行程序所依赖的库按照动态节(dynamic section)列出的顺序被装载进来,然后是“第一个被依赖的库”所依赖的库按照同样的方法装载进来,以此类推,直到所有的依赖关系都被解决。

在命令行运行下面的命令,会得到更多关于Linux动态链接器的信息:

(代码)(P69第最后一行)

$ info ld.so

3.5.1 编程接口

Linux提供了一套API来动态装载库。下面列出了这些API:

- dlopen,打开一个库,并为使用该库做些准备。

- dlsym,在打开的库中查找符号的值。

- dlclose,关闭库。

- dlerror,返回一个描述最后一次调用dlopen、dlsym,或dlclose的错误信息的字符串。

C语言用户需要包含头文件dlfcn.h才能使用上述API。glibc还增加了两个POSIX标准中没有的API:

- dladdr,从函数指针解析符号名称和所在的文件。

- dlvsym,与dlsym类似,只是多了一个版本字符串参数。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读