Ubuntu Linux---GNU libc库
在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类似,只是多了一个版本字符串参数。 (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |