链接装载与库

上传人:jin****ng 文档编号:196977526 上传时间:2023-04-02 格式:DOCX 页数:5 大小:53.16KB
收藏 版权申诉 举报 下载
链接装载与库_第1页
第1页 / 共5页
链接装载与库_第2页
第2页 / 共5页
链接装载与库_第3页
第3页 / 共5页
资源描述:

《链接装载与库》由会员分享,可在线阅读,更多相关《链接装载与库(5页珍藏版)》请在装配图网上搜索。

1、链接、装载与库在Linux下,当我们使用gcc来编译HelloWord程序时,只需要$gcc hello.c$./a.outHello world其中实际包括4步骤:预处理(Prepressinng),编译(Compliation),汇编(Assembly), 链接(Linking)1预编译$ gcc -E hello.c -o hello.i或 $ cpp helloc hello.i预编译主要处理源代码文件中一 “#开始的预编译指令。(删除#define,处理预编译 指令,删除/* */,添加文件行号和文件名标示,保留所有编译器指令#progam)。经过预编 译的.i文件不包含任何宏定义,

2、(所有宏定义已经展开)。2编译编译就是把预编译完的文件进行一系列词法分析,语法分析,语义分析以及优化后生成 相应汇编代码文件。$ gcc -s hello.c -o hello.s词法分析-识别单词,确认词类;比如inti;知道int是一个类型,i是一个关键字 以及判断i的名字是否合法语法分析-识别短语和句型的语法属性;语义分析-确认单词、短语和句型的语义特征;代码优化-修辞、文本编辑;代码生成-生成译文。内联函数的替换就发生在这一阶段3汇编汇编过程就是根据汇编指令和机器指令对照表进行翻译,生成目标机器指令。在最终的目标文件中除了拥有自己的数据和二进制代码之外,还要至少提供2个表:未解 决符号

3、表和导出符号表,分别告诉链接器自己需要什么和能够提供什么。编译器把一个cpp编译为目标文件的时候,除了要在目标文件里写入cpp里包含的数据和代码,还要至少提供3个表:未解决符号表,导出符号表和地址重定向表。未解决符号表提供了所有在该编译单元里引用但是定义并不在本编译单元里的符号及其出 现的地址。导出符号表提供了本编译单元具有定义,并且愿意提供给其他编译单元使用的符号及其地 址。地址重定向表提供了本编译单元所有对自身地址的引用的记录。$ g+ -c main.s -o main.o4链接将生成的目标文件和系统库文件进行链接最终生成了可以在特定平台运行的可执行文 件。1地址和空间分配从输入目标文件

4、获取各段长度,属性以及位置,并将输入目标文件中符号表所有符号定义和符号引用收集同意放到全局符号表。2符号解析与重定位符号解析。将每个符号引用刚好和一个符号定义联系起来。使用的表:符号表重定位。链接器把每个符号定义与一个虚拟地址联系起来,然后修改所有对这些符 号的引用,使得它们指向这个存储位置,从而重定位这些节。使用的表:重定位表,符号表链接器的工作顺序:当链接器进行链接的时候,首先决定各个目标文件在最终可执行文件里的位置。然 后访问所有目标文件的地址重定义表,对其中记录的地址进行重定向(加上一个偏移量, 即该编译单元在可执行文件上的起始地址)。然后遍历所有目标文件的未解决符号表, 并且在所有的

5、导出符号表里查找匹配的符号,并在未解决符号表中所记录的位置上填写 实现地址。最后把所有的目标文件的内容写在各自的位置上,就生成一个可执行文件。静态库链接在这种链接方式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序 中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际 上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。动态库链接在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链 接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记 信息。在此可执行文件被执行时,动态链接库的全

6、部内容将被映射到运行时相应进程的虚地 址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接 能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存, 因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态 链接要优越。在某些情况下动态链接可能带来一些性能上损害。全局符号(强/弱)编译器编译源文件时会把源文件的全局符号(global symbol)分成强(strong)和 弱(weak)两类传给汇编器,而随后汇编器则将强弱信息编码并保存在目标文件 的符号表中

7、。那么何谓强弱呢?编译器认为函数与初始化了的全局变量都是强符 号,而未初始化的全局变量则成了弱符号。规则1:不允许强符号被多次定义(即不同的目标文件中不能有同名的强符 号);规则2:如果一个符号在某个目标文件中是强符号,在其它文件中都是弱符 号,那么选择强符号;规则3:如果一个符号在所有目标文件中都是弱符号,那么选择其中任意一 个;全局构造与析构般 C /C + +程序从main()函数开始,随着main()结束而结束。其实在main()函数 被调用前,为了程序顺利执行,要初始化进程执行环境。队分配初始化2. 线程子系统3. C+全局对象构造函数ABI (applica tion binary int erface )应用程序二进制接口描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的低接口。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!