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