LUNIX静态库和共享库编译和实现.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
LUNIX静态库和共享库编译和实现

LUNIX静态库和共享库编译和实现 一、基本概念 1.1、什么是库 在 windows 平台和 linux 平台下都大量存在着库。 本质上来说库是 一种可执行代码的二进制形式,可以被操作系统载入内存执行。 由于 windows 和 linux 的平台不同(主要是编译器、汇编器和连接器 的不同),因此二者库的二进制是不兼容的。 本文仅限于介绍 linux 下的库。 1.2、 库的种类 linux 下的库有两种:静态库和共享库(动态库)。 二者的不同点在于代码被载入的时刻不同。 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。 静态用.a为后缀, 例如: libhello.a 共享库(动态库)的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。 动态通常用.so为后缀, 例如:libhello.so 共享库(动态库)的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。 ln -s libhello.so.1.0 libhello.so.1 ln -s libhello.so.1 libhello.so 1.3、静态库,动态库文件在linux下是如何生成的: 以下面的代码为例,生成上面用到的hello库: /* hello.c */ #include hello.h void sayhello() { printf(hello,world ); } 首先用gcc编绎该文件,在编绎时可以使用任何合法的编绎参数,例如-g加入调试代码等: $gcc -c hello.c -o hello.o 1、生成静态库 生成静态库使用ar工具,其实ar是archive的意思 $ar cqs libhello.a hello.o 2、生成动态库 用gcc来完成,由于可能存在多个版本,因此通常指定版本号: $gcc -shared -o libhello.so.1.0 hello.o 1.4、库文件是如何命名的,有没有什么规范: 在 linux 下,库文件一般放在/usr/lib和/lib下, 静态库的名字一般为libxxxx.a,其中 xxxx 是该lib的名称; 动态库的名字一般为libxxxx.so.major.minor,xxxx 是该lib的名称,major是主版本号,minor是副版本号 1.5、可执行程序在执行的时候如何定位共享库(动态库)文件 : 当系统加载可执行代码(即库文件)的时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径,此时就需要系统动态载入器 (dynamic linker/loader) 对于 elf 格式的可执行程序,是由 ld-linux.so* 来完成的,它先后搜索 elf 文件的 DT_RPATH 段—环境变量LD_LIBRARY_PATH—/etc/ld.so.cache 文件列表— /lib/,/usr/lib 目录找到库文件后将其载入内存 如: export LD_LIBRARY_PATH=’pwd’ 将当前文件目录添加为共享目录 1.6、使用ldd工具,查看可执行程序依赖那些动态库或着动态库依赖于那些动态库: ldd 命令可以查看一个可执行程序依赖的共享库, 例如 # ldd /bin/lnlibc.so.6 = /lib/libc.so.6 (0/lib/ld-linux.so.2 = /lib/ld- linux.so.2 (0 可以看到 ln 命令依赖于 libc 库和 ld-linux 库 1.7、使用nm工具,查看静态库和动态库中有那些函数名(T类表示函数是当前库中定义的,U类表示函数是被调用的,在其它库中定义的,W类是当前库中定义,被其它库中的函数覆盖)。: 有时候可能需要查看一个库中到底有哪些函数,nm工具可以打印出库中的涉及到的所有符号,这里的库既可以是静态的也可以是动态的。 nm列出的符号有很多, 常见的有三种:: 一种是在库中被调用,但并没有在库中定义(表明需要其他库支持),用U表示; 一种是在库中定义的函数,用T表示,这是最常见的; 另外一种是所 谓的“弱态”符号,它们虽然在库中被定义,但是可能被其他库中的同名符号覆盖,用W表示。 例如,假设开发者希望知道上文提到的h

文档评论(0)

htfyzc + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档