linux_lib_dev.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文档。上传文档
查看更多
linux_lib_dev

linux_lib_dev Copyright (C) 1999, 2000 jargon jargon@263.net All rights reserved THIS DOCUMENT IS PRESENT TO HTTP://SMTH.ORG FOR ACADEMIC PURPOSE ONLY. NO OTHER USAGE AND/OR DISTRIBUTION OUTSIDE OF SMTH.ORG IS ALLOWED. ---------------------------------------------------------------------------- Linux下的动态连接库及其实现机制 摘 要:本文介绍了动态连接库的优点,详细阐述了x86体系结构上Linux系统的编译器 、连接器、加载器如何使用多种重定位方式来实现该功能 关键词:动态连接库;Linux;重定位 The Implementation Mechanism of DLL under Linux 【Abstract】In this paper, we discuss the advantage of using dynamic linking . We also demonstrate in detail how compiler, linker and loader implement th is feature by using several kinds of relocations under nowadays Linux system , especially on x86 architectures. 【Keywords】dynamic link library; DLL; Linux; relocation Linux与Windows的动态连接库概念相似,但是实现机制不同。它引入了GOT表和PLT表的 概念,综合使用了多种重定位项,实现了浮动代码,达到了更好的共享性能。本文对 这些技术逐一进行了详细讨论。 本文着重讨论x86体系结构,这是因为(1)运行Linux的各种体系结构中,以x86最为普及 ;(2)该体系结构上的Windows操作系统广为人知,由此可以较容易的理解Linux的类似概 念; 下表列出了Windows与Linux的近义词,文中将不加以区分: Windows Linux 动态连接库(DLL) Shared Object 目标文件(.obj) 文件名结尾常是 .o 可执行文件(.exe) Executable(文件名无特定标志) 连接器(link.exe) Linker Editor (ld) 加载器(exec/loader) Dynamic Linker (ld-linux.so) 段(segment) 节(section) 一些关键字在本文中有特定含义,需要澄清: 编译单元:一个C语言源文件,经过编译后将生成一个目标文件 运行模块:一个动态连接库或者一个可执行文件。简称为模块 自动变量、函数:C语言auto关键字修饰的对象 静态变量、函数:C语言static关键字修饰的对象 全局变量、函数:C语言extern关键字修饰的对象 1 动态连接库的优点 程序编制一般需经编辑、编译、连接、加载和运行几个步骤。由于一些公用代码需要反 复使用,就把它们预先编译成目标文件并保存在库中。当它与用户程序的目标文件连 接时,连接器得从库中选取用户程序需要的代码,然后复制到生成的可执行文件中。这 种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝。显然,当静态 库被多个程序使用时,磁盘上、内存中都是多份冗余拷贝。 而使用动态连接库就克服了这个缺陷。当它与用户程序的目标文件连接时,连接器只是 作上标记,说明程序需要该动态连接库,而不真的把库代码复制到可执行文件中;仅当 可执行文件运行时,加载器根据这个标记,检查该库是否已经被其它可执行文件加载进 内存。如果已存在于内存中,不用再从磁盘上加载,只要共享内存中已有的代码即可。 这样磁盘、内存中始终只有一份代码,较静态库为优。 2 Linux动态连接库的重要特点:浮动代码 在Windows中,连接生成动态连接库时要指定一个首地址。应用程序运行时,加载器将尽 可能把动态连接库装入到该地址;如果地址已被占用,该动态连接库只能被加载到其它 地址空间内,这时就要对库中的代码和数据进行修补,或叫做重定位。如此一来,库的 多个实例在内存中经过重定位后,彼此将不尽相同,自然不再能共享了。为了避免这个 缺陷,Windows自带的库都指定了互

文档评论(0)

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

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

1亿VIP精品文档

相关文档