《深入理解计算机系统》第七章——链接知识点总结
目录
7.1编译器驱动程序
7.2静态链接
7.3目标文件
7.4可重定位目标文件
7.5符号和符号表
7.6符号解析
• 静态库(.a archive files)
7.1编译器驱动程序
7.2静态链接
7.3目标文件
7.4可重定位目标文件
使用readelf -S查看hello.o
一个典型的ELF可重定位目标文件包含以下几个节:
.text:已编程序的机器代码。
.rodata:只读数据,比如printf语句中的格式串和开关语句的跳转表。
.data:已初始化的全局和静态C变量。局部C变量在运行时被保存在栈中,既不出现在.data节中,也不出现在.bss节中。
.bss:未初始化的全局和静态C变量,以及所有被初始化为0的全局或静态变量。在目标文件中这个节不占据实际的空间,他仅仅是一个占位符。目标文件格式区分已初始化和未初始化变量是为了空间效率:在目标文件中,未初始化变量不需要占据任何实际的磁盘空间,运行时,在内存中分配这些变量,初始值为0。
.symtab:一个符号表,它存放在程序中定义和引用的函数和全局变量的信息。一些程序员错误的认为必须通过-g选项来编译一个程序,才能得到符号表的信息。实际上,每个可重定位目标文件在.symtab中都有一张符号表(除非程序员特地用STRIP命令去掉它)。然而,和编译器中的符号表不同,.symtab符号表不包括局部变量的条目。
.rel.text:一个.text节中位置的列表,当链接器把这个目标文件和其他文件组合时,需要修改这些位置。一般而言,任何调用外部函数或者引用全局变量的指令都需要修改。另一方面,调用本地函数的指令则不需要修改。注意,可执行目标文件中并不需要重定位信息,因此通常省略,除非用户显示的指示链接器包含这些信息。
.rel.data:被模块引用或定义的所有全局变量的重定位信息。一般而言,任何已初始化的全局变量如果他的初始值是一个全局变量地址或者外部定义函数的地址,都需要被修改、
.debug:一个调试符号表,其条目是程序中定义的局部变量那个和类型定义,程序中定义和引用的全局变量,以及原始的C源文件。只有以-g选项调用编译器驱动程序时,才会得到这张表。
.line:原始C源程序中的行号和.text节中机器指令之间的映射。只有以-g选项调用编译器驱动程序时,才会得到这张表。
.strtab:一个字符串表,其内容包括.symtab和.debug节中的符号表,以及节头部中的节名字。字符串表就是以null结尾的字符串的序列。
7.5符号和符号表
习题:
注意:
COMMON:未初始化的全局变量
.bss:未初始化的静态变量,以及初始化为0的全局或静态变量
7.6符号解析
学会判断:
全局符号的强/弱特性
– 函数名和已初始化的全局变量名是强符号
– 未初始化的全局变量名是弱符号
习题:
三大规则:
多重定义符号的处理规则
Rule 1: 强符号不能多次定义 –强符号只能被定义一次,否则链接错误
Rule 2: 若一个符号被定义为一次强符号和多次弱符号,则按强定义为准 –对弱符号的引用被解析为其强定义符号
Rule 3: 若有多个弱符号定义,则任选其中一个 –使用命令gcc –fno-common链接时,会告诉链接器在遇到多个弱定义的全局符号时输出一条警告信息。符号解析时只能有一个确定的定义(即每个符号仅占一处存储空间)
习题1:
习题2:
习题3:
总结:
• 尽量避免使用全局变量
• 一定需要用的话,就按以下规则使用
–尽量使用本地变量(static)
–全局变量要赋初值
–外部全局变量要使用extern
多重定义全局变量会造成一些意想不到的错误,而且是默默发生 的,编译系统不会警告,并会在程序执行很久后才能表现出来, 且远离错误引发处。特别是在一个具有几百个模块的大型软件中, 这类错误很难修正。 大部分程序员并不了解链接器如何工作,因而养成良好的编程习 惯是非常重要的。
• 静态库(.a archive files)
–将所有相关的目标模块(.o)打包为一个单独的库文件 (.a),称为静态库文件,也称存档文件(archive)
–使用静态库,可增强链接器功能,使其能通过查找一个 或多个库文件中定义的符号来解析符号
–在构建可执行文件时,只需指定库文件名,链接器会自动到库中寻找那些应用程序用到的目标模块,并且只把用到的模块从库中拷贝出来
–在gcc命令行中无需明显指定C标准库libc.a(默认库)
相关文章:
排序算法之直接插入排序
1、基本思想: 已知待排序列r[1...n],先将序列中的第一个记录看成是一个有序的子序列,然后从第二个记录起逐个进行插入,直至整个序列变成关键字非递减有序序列为止。 具体操作如下: (1)查找出r[i]在有序序列…

【代码片段】如何使用CSS来快速定义多彩光标
对于web开发中,我们经常都看得到需要输入内容的组件和元素,比如,textarea,或者可编辑的DIV(contenteditable) ,如果你也曾思考过使用相关方式修改一下光标颜色的,那么这篇技术小分享,你绝对不应…

如何划分155MSDH带宽
我们单位拟计划租用运营商155MSDH电路,由于我们单位应用业务较多,为了避免各业务之间相互影响,更好地分享带宽,根据各业务数据量的大小,分别赋予一定的带宽,使各业务在自己的带宽内传输,但不知选…

慕课袁春风老师《计算机系统基础》一二三部分练习题
2.2 1、下列几种存储器中,( A )是易失性存储器。 A. cache B. EPROM C. Flash Memory D. CD-ROM 2、下面有关半导体存储器组织的叙述中,错误的是( D )。 A. 存储器的核心部分是存储阵列,…

47种常见的浏览器兼容性问题大汇总
浏览器兼容性问题大汇总 JavaScript 31. HTML对象获取问题 32. const问题 33. event.x与event.y问题 34. window.location.href问题 35. frame问题 36. 模态和非模态窗口问题 37. firefox与IE的父元素(parentElement)的区别 38. document.formName.item(”itemName”) 问题 39.…
封装了一下我佛山人4.0 (支持vs2005)asp.net 页面验证
第一次写控件,拿“我佛山人4.0”开个刀,实际上也不算是什么控件,只是封装了一下,方便在asp.net中使用。 建议先看“我佛山人 4。0”文档。 声明:控件中参考了不少网上的源码,大家不要觉得眼熟BS人啊。注&am…

九章算法班L8 Array Number
转载于:https://www.cnblogs.com/sissie-coding/p/10295478.html

linux密码时效更改方法
密码时效 按目前的形势,已有更强大的硬件大大地缩短了利用自动运行的程序来猜测密码的时间。因此在UNIX系统中防止密码被***的别一方法就是要经常地改变密码。很多时候,用户却不改变密码。因此一种机制用来强制规律性的更改密码是合乎要求的。这种技术称…

YOLOv10训练自己的数据集
至此,整个YOLOv10的训练预测阶段完成,与YOLOv8差不多。欢迎各位批评指正。

安卓相对布局常用语句
不BB写在自己博客园看的舒服 RelativeLayout布局 android:layout_marginTop"25dip" //顶部距离 android:gravity"left" //空间布局位置 android:layout_marginLeft"15dip //距离左边距 // 相对于给定ID控件 android:layout_above 将该控件的底部置于…

Tomcat V6 Examples移植到Apusic V5.1
目标:将Tomcat V6的的例子Examples移植到Apusic V5.1上术语:Tomcat:只提供了WEB容器的开源服务器;Apusic:提供了完整的J2EE支持的商用服务器;%TOMCAT_HOME%:Tomcat安装目录%APUSIC_HOME%&#x…

Android 活动与活动间数据传递--登录注册页面
AndroidManifest.xml: <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"package"com.example.myapplica…

使用SVG中的Symbol元素制作Icon
前言 随着大屏幕分辨率的普及以及各种移动设备层出不穷的移动互联网时代的到来,我们在网站设计时更应该关心内容在各种设备上的阅读性和显示效果。我们都希望能在任何时间,任何设备上都能清楚的,高效的传递信息给用户。 而随着各种高清视网膜…

【JOURNAL】恭喜发财
刚写完上一条blog不久,南京城里开始响彻了鞭炮声,人见人爱、极具亲和力的财神来了。上海的一个朋友发短信来说那个国际化大都市也被对财神的膜拜感染得热闹喧天。这是好的。昨天给老婆表亲家的孩子压岁钱,对方说免了吧,我坚持让他…

[树形dp] Jzoj P5233 概率博弈
Description 小A和小B在玩游戏。这个游戏是这样的:有一棵n个点的以1为根的有根树,叶子有权值。假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列。一开始在1号点有一颗棋子。两人轮流将这颗棋子移向其当前位置的一个儿子。假…

ASP.NET获取IP的6种方法
服务端: //方法一HttpContext.Current.Request.UserHostAddress; //方法二HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];//方法三stringstrHostName System.Net.Dns.GetHostName();stringclientIPAddress System.Net.Dns.GetHostAddresse…

软件工程实践第一次作业
准备篇 一、回想一下你初入大学时对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的? 在读到博文B时,博客B[1]的作者说道:“ 那时,对其他学校认知的匮乏让自己无助起来,最后的抉择,是希望选择一个…

VC 6.0不老
最近做的几个项目,客户都是要求使用Vc 6开发,我用的是VC 6.0 Sp6。VC 6 装上插件之后发现使用方便多了,下面是转载[url]http://hi.baidu.com/linuxtoys/blog/item/5f4251a9f12a53fd1e17a272.html[/url] 的一篇关于VC6的小插件的文章ÿ…

[03] 处理注解:反射
1、AnnotatedElement接口如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中,很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器。Java用An…

P2261 [CQOI2007]余数求和
我是题面 题意还是很清晰,很容易理解 1e9范围明显不能暴力,除非你能把常数优化到\(\frac1 {10}\),但我实在想象不到用了这么多取模怎么把常数优化下去 我们可以把\(k\%i\)变成\(k-k/i*i\)(整除) 那么总的和也就从\(\sum_{i1}^{n}k\%i\)变成了…

Windows Server 2008正式版[微软官方下载地址+官方语言包]
Windows Server 2008(包含 Standard Enterprise Datacenter)32http://download.microsoft.com/download/d/d/b/ddb17dc1-a879-44dd-bd11-c0991d292ad7/6001.18000.080118-1840_x86fre_Server_en-us-KRMSFRE_EN_DVD.iso64http://download.microsoft.com/download/d/d/b/ddb17dc1…

线性代数-矩阵-【5】矩阵化简 C和C++实现
点击这里可以跳转至 【1】矩阵汇总:http://www.cnblogs.com/HongYi-Liang/p/7287369.html 【2】矩阵生成:http://www.cnblogs.com/HongYi-Liang/p/7275278.html 【3】矩阵加减:http://www.cnblogs.com/HongYi-Liang/p/7287403.html 【4】矩阵…

哈佛管理论丛:谁背上了令人讨厌的猴子
先说说我的读后感想: 在团队管理中,应该尽量明晰的界定每一位团队成员在当前的任务中充当的角色和应该负责的职责。 实际的执行方法就是:约定好给猴子喂食的时间,并且确定在喂食时间到来时,猴子应该长成什么样子。 所以…

json_encode 中文不乱码
echo json_encode("中文", JSON_UNESCAPED_UNICODE);//"中文" 转载于:https://www.cnblogs.com/zxqblogrecord/p/10300244.html
Android-room的学习
目录 关于ROOM 1.Room有3个主要的组件 2.Room 不同组件之间的关系如图所示 3.导入ROOM(使用 Room 需要添加依赖) 4.(实现数据库操作的步骤)以下代码段包含具有一个实体和一个 DAO 的示例数据库配置 实例demo 1.Student.java …

JDK5中的控制台输入
Scanner类是JDK5新添加的一个类,主要作用是处理输入流、文件和文本内容等 。这个类在java.util包里面,实现了Iterator接口,而且io处理采用了jdk1.4才发布的nio。由于这个类实现了Iterator接口,如果全部是string的话,就…

[BZOJ3779]重组病毒(LCT+DFS序线段树)
同[BZOJ4817]树点涂色,只是多了换根操作,分类讨论下即可。 1 #include<cstdio>2 #include<algorithm>3 #define lc ch[x][0]4 #define rc ch[x][1]5 #define ls (x<<1)6 #define rs (ls|1)7 #define lson ls,L,mid8 #define rson rs,m…

UVA - 1594 Ducci Sequence
/*做这题时的心路历程其实挺有趣的一开始看到说Ducci序列最终要么全0,要么循环,我在想:要怎么判断循环呢?是不是还得记录下循环节什么的?是该用数组记录循环节吗?还是想要让我们利用STL来记录?后…

RTF密码破解
有一个RTF文件带密码,用文本编辑器察看,有类似“password”字样。为了编辑它,有两个方法: 1、用word2000打开该文件,Tools--〉Unprotect Document,执行后,文件就可以正常编辑了。如果有多个文件…