快速业务通道

Linux程序库的构建和使用

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-07

如果需要的话,我们还可以删除静态库中的目标程序,为此需要用到-d选项,如下所示:

$ ar -d libmyrand.a initapi.o
$ ar -t libmyrand.a

randapi.o
$

这里要引起注意的是,使用上述命令ar执行删除任务失败时,它是不会通知我们的,要想查看出错信息,需要添加-v选项,如下所示:

$ ar -d libmyrand.a initapi.o
$ ar -dv libmyrand.a initapi.o
No member named ‘initapi.o’
$

在前一种情况下,如果我们试图删除目标文件initapi.o,尽管该静态库中并没有这个文件,但是却没有产生任何错误消息.在第二种情况下,我们添加v选项后就得到了相应的错误信息.我们不仅可以从静态库删除目标文件,还可以通过-x选项来从中提取目标文件,如下所示:

$ ar -xv libmyrand.a initapi.o
x - initapi.o
$ ls
initapi.o libmyrand.a
$ ar -t libmyrand.a
randapi.o
initapi.o
$

选项-x和-v结合使用后,我们能够得到更多的信息.提供在相应子目录中键入ls命令,我们就能看到实用程序ar提取的文件.这里我们要注意的是,我们同时还列出了提取文件后的静态库的内容,我们发现initapi.o仍然在那里,也就是说,提取选项实际上并没有删除静态库中的目标文件,而只是复制了一份而已.要想删除静态库中的目标文件,使用删除选项-d.

三、共享库的创建和使用

现在,我们开始介绍共享库,为了省劲,我们依然使用前面的测试程序.,我们用initapi.o和randapi.o这两个目标文件来建立一个共享库.与静态库相比,在为共享库编译源代码时有些不同之处.

与使用静态库的情形不同,使用共享库时,程序库并没有放进应用程序的可执行文件中,共享库的代码应该使用相对寻址方式,比如通过全局偏移表(GOT)寻址.加载共享库时,加载器会自动地解析所有GOT地址.编译源文件时,为了让生成的目标文件具有位置无关性,我们需要使用gcc的PIC选项:

$ gcc -fPIC -c initapi.c
$ gcc -fPIC -c randapi.c

这样得到的两个目标文件的代码就具有位置无关性.我们可以使用带有-shared标志的gcc命令来创建一个共享库,这个标志的作用是告诉gcc要建立的是一个共享库:

$ gcc -shared initapi.o randapi.o -o libmyrand.so

我们利用-o规定两个目标模块作为共享库输出.注意,这里我们使用.so后缀来指出该文件是一个共享库.为了使用新建的共享库,即共享目标文件来创建应用程序,我们需要连接共享库中的所需元素,这一点与静态库是一致的:

$ gcc test.c -L. -lmyrand -o test

要想知道新的二进制映像依赖于哪些共享库,可以使用ldd命令,该命令会打印出某个应用程序所依赖的共享库.举例来说:

$ ldd test
libmyrand.so => not found
libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
$

命令ldd能确定出我们的测试程序需要用到哪些共享库.其中libc.so.6是标准C库,ld-linux.so.2是动态链接器/装载器.注意,这里显示没有发现libmyrand.so,这是虽然该文件存在于应用程序的目录中,但是我们显式指出.我们可以通过环境变量LD_LIBRARY_PATH来完成此任务.给出我们的共享库的位置之后,再次使用ldd命令:

与dlopen相似,dlclose也提供了一种机制,共享目标文件可以通过该机制来导出一个完成例程,以便当在调用API函数dlclose的时候该完成例程.开发人员只需为共享库添加一个称为_fini的函数,dlclose将在返回之前调用_fini函数.

看到了吧,虽然需要少量的改动,但是应用程序使用动态载入的共享库之后,不仅带来了更大的灵活性,还可以显著的节约内存(参见前面的图1和图2).需要注意的是,当应用程序启动时,并不要求所有的动态函数对

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号