[学习笔记]《CSAPP》深入理解计算机系统 - Chapter 7 链接

总结一些第七章的一些关键信息

  • Chapter 7 链接
    • 编译器驱动程序
    • 目标文件
    • 与静态库链接
    • 动态链接共享库
    • 加载可执行目标文件

Chapter 7 链接

  1. 链接由"链接器(separate compilation)"的程序自动执行的

编译器驱动程序

// main.c
int sum(int *a, int *n);int array[2] = {1, 2};int main()
{int val = sum(array, 2);return val;
}// sum.c
int sum(int *a, int n)
{int i, s = 0;for (i = 0; i < n; i++) {s += a[i];}return s;
}
  1. 驱动程序首先运行C预处理器(cpp),将源程序翻译成一个ASCII码的中间文件main.i
  2. 然后驱动器运行C编译器(ccl),将main.i翻译成一个ASCII汇编语言文件main.s
  3. 然后运行汇编器as,将main.s翻译成一个“可重定位目标文件(relocatable object file)main.o
  4. 通过相同的过程生成sum.o
  5. 最后运行链接器程序ld,将main.osum.o以及一些必要的系统目标文件组合起来,创建一个可执行目标文件executable object file prog
    ld -o prog [system object files and args] main.o sum.o

目标文件

  • 可重定位目标文件: 包含二进制代码和数据,其形式可以在编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件
  • 可执行目标文件: 包含二进制代码和数据,其形式可以被直接复制到内存并执行
  • 共享目标文件: 一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态地加载进内存并链接

reference to Page 467 to understand 可重定位目标文件里的内存内容,比如ELF.text, .rodata, .data, .bss, .symtab, .rel.text, .rel.data, .debug等内容

ps: 初始化的全局和静态C变量存在 .data里。

局部 C 变量在运行时被保存在栈中;

未初始化的全局和静态C变量,以及所有被初始化为0的全局或静态变量保存在 .bss中,且不占据实际空间,仅仅是一个占位符。

区分初始化和非初始化是为了空间效率: 在目标文件中,未初始化变量不需要占据任何实际的磁盘空间。运行时,在内存中分配这些变量,初始值为0

.debug: 一个调试符号表,只有以 -g 选项调用编译器驱动程序时,才会得到这个表

  1. C++ and JAVA都允许重载方法,这些方法在源代码中有相同的名字,却有不通的参数列表。这是编译器将每个唯一的方法和参数列表组成编码成一个对链接器来说唯一的名字。

与静态库链接

相关函数被编译为独立的目标模块,然后封装成一个单独的静态库文件。
linux> gcc main.c xxx.a bbb.a,在链接时,链接器将只赋值被程序引用的目标模块(函数),这就减少了可执行文件在磁盘和内存中的大小。

编译静态库示例

linux> gcc -c func1.c func2.c
linux> ar rcs libfunc.a func1.o func2.o
// 编写一个头文件func.h,里面时对两个.c文件中函数的声明, 并在 main.c 中包含这个头文件
linux> gcc -c main.c
linux> gcc -static -o prog main.o -L. -lfunc
or
linux> gcc -static -o prog main.o ./libfunc.a

-static 高速编译器驱动程序,链接器应该构建一个完全链接的可执行目标文件, 它可以加载到内存并运行,在加载时无需更进一步的链接
-lfunc参数是libfunc.a的缩写
-L. 参数高速链接器在当前目录下(.)查找libfunc.a

reference to page 477
链接器的主要任务是将程序的不同部分(如编译后的代码模块、库文件、目标文件等)合并成一个单一的可执行文件或库文件。这个过程涉及到几个关键步骤,包括解析头文件中的引用和库文件或目标文件中的定义。以下是链接器如何工作的详细说明:解析符号引用:头文件中的声明(如函数原型和变量声明)在编译时被转换为符号引用,这些引用在目标文件中被保留。

如果定义一个符号的库,出现在引用这个符号的目标文件之前,引用就不能被解析,链接会失败

动态链接共享库

是一个目标模块,在运行或加载时,可以加载到任意的内存地址,并和一个在内存中的程序链接起来。这个过程称为动态链接,由一个叫动态链接器的程序执行。

一个库只有一个.so文件。所有引用该库的可执行目标文件共享这个 .so文件中的代码和数据,而不是像静态库的内容那样被复制和嵌入到引用他们的可执行文件中。其次,在内存中,一个共享库的.text节的一个副本,可以被不通的正在运行的进程共享。(reference chatper 9)

linux> gcc -shared -fpic -o libfunc.so func1.c func2.c
-fpic指示编译器生成与位置无关的代码
-shared指示链接器创建一个共享的目标文件。
linux> gcc -o prog main.c ./libfunc.so

加载可执行目标文件

每一个Linux程序都有一个运行时内存影响。从地址 2 48 2^{48} 248开始(示例),是为内存中的代码和数据保留的,也就是所谓的内核。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/879546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据处理技术:HBase的安装与基本操作

目录 1 实验名称 2 实验目的 3 实验内容 4 实验原理 5 实验过程或源代码 5.1 Hbase数据库的安装 5.2 创建表 5.3 添加数据、删除数据、删除表 5.4 使用Java操作HBase 6 实验结果 6.1 Hbase数据库的安装 6.2 创建表 6.3 添加数据、删除数据、删除表 6.4 使用Java操…

【Elasticsearch系列七】索引 crud

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

数据结构(Day13)

一、学习内容 内存空间划分 1、一个进程启动后&#xff0c;计算机会给该进程分配4G的虚拟内存 2、其中0G-3G是用户空间【程序员写代码操作部分】【应用层】 3、3G-4G是内核空间【与底层驱动有关】 4、所有进程共享3G-4G的内核空间&#xff0c;每个进程独立拥有0G-3G的用户空间 …

[数据集][目标检测]烟叶病害检测数据集VOC+YOLO格式612张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;612 标注数量(xml文件个数)&#xff1a;612 标注数量(txt文件个数)&#xff1a;612 标注类别…

【鸿蒙】HarmonyOS NEXT星河入门到实战7-ArkTS语法进阶

目录 1、Class类 1.1 Class类 实例属性 1.2 Class类 构造函数 1.3 Class类 定义方法 1.4 静态属性 和 静态方法 1.5 继承 extends 和 super 关键字 1.6 instanceof 检测是否实例 1.7.修饰符(readonly、private、protected 、public) 1.7.1 readonly 1.7.2 Private …

汽车免拆诊断案例 | 沃尔沃V40 1.9TD断续工作

故障现象 一辆04款的沃尔沃V40 1.9 TD&#xff0c;发动机代码D4192T3&#xff0c;使用博世EDC15C发动机管理。客户说车子断续工作&#xff0c;怀疑是正时皮带出现问题。卸下上皮带盖&#xff0c;检查发现皮带仍然在原来的位置上并且没有出现松动。起动发动机&#xff0c;车辆能…

安卓玩机工具-----ADB与 FASTBOOT模式 图形化 多功能玩机刷机工具

工具说明 这款工具是英文版。易于使用的工具提供了用于运行 ADB 和 Fastboot 命令的图形用户界面。ADB 功能包括旁加载、安装和卸载应用程序、测试设备以及重新启动到不同的模式。可以使用 fastboot 命令进行设备管理;其中包括检查 Antirollback 和 active slots 等变…

YOLOv8 人体姿态估计动作识别关键点检测(代码+教程)

YOLOv8 人体姿态判断 项目介绍 YOLOv8 人体姿态判断 是一个基于最新YOLOv8模型的深度学习项目&#xff0c;旨在识别和分析人体姿态。该项目利用先进的计算机视觉技术和深度学习框架&#xff0c;通过摄像头捕捉实时图像或处理存储图像&#xff0c;识别人体的关键点&#xff0c…

在线查看 Android 系统源代码 AOSPXRef and AndroidXRef

在线查看 Android 系统源代码 AOSPXRef and AndroidXRef 1. AOSPXRef1.1. http://aospxref.com/android-14.0.0_r2/1.2. build/envsetup.sh 2. AndroidXRef2.1. http://androidxref.com/9.0.0_r3/2.2. build/envsetup.sh 3. HELLO AndroidReferences 1. AOSPXRef http://aospx…

加密与安全_优雅存储用户密码的最佳实践

文章目录 Pre概述最佳实践避免使用MD5、SHA1等快速哈希算法加盐哈希 &#xff08;不推荐&#xff09;使用BCrypt、Argon2等慢哈希算法 (推荐)BCrypt Code1. 自动生成和嵌入盐2. 哈希结果的格式3. 代价因子 BCrypt特点 防止暴力破解1. 登录失败锁定2. 双因素认证&#xff08;2FA…

Golang | Leetcode Golang题解之第409题最长回文串

题目&#xff1a; 题解&#xff1a; func longestPalindrome(s string) int {mp : map[byte]int{}for i : 0; i < len(s); i {mp[s[i]]}res : 0for _, v : range mp {if v&1 1 {res v - 1} else {res v}}if res<len(s) {res}return res }

Python酷库之旅-第三方库Pandas(117)

目录 一、用法精讲 516、pandas.DataFrame.add_suffix方法 516-1、语法 516-2、参数 516-3、功能 516-4、返回值 516-5、说明 516-6、用法 516-6-1、数据准备 516-6-2、代码示例 516-6-3、结果输出 517、pandas.DataFrame.align方法 517-1、语法 517-2、参数 51…

Go语言基本语法

Go语言&#xff08;通常称为Golang&#xff09;是由Google开发的一种静态类型、编译型语言&#xff0c;它旨在简化系统编程、网络编程和并发编程的复杂性。 Go语言以其简洁、高效和易于理解的语法而受到开发者的喜爱。 Go语言的一些基本语法元素&#xff1a; 1. 包&#xff…

protobuf中c、c++、python使用

文章目录 protobuf实例&#xff1a;例题1&#xff1a;[CISCN 2023 初赛]StrangeTalkBot分析&#xff1a;思路&#xff1a;利用&#xff1a; 例题2&#xff1a;[CISCN 2024]protoverflow分析&#xff1a; protobuf Protocol Buffers&#xff0c;是Google公司开发的一种数据描述语…

数学学习记录

9月14日 1.映射&#xff1a; 2.函数: 9月15日 3.反函数&#xff1a; 4.收敛数列的性质 5.反三角函数&#xff1a; 9月16日 6.函数的极限&#xff1a; 7.无穷小和无穷大 极限运算法则&#xff1a;

远程Linux网络连接( Linux 网络操作系统 04)

接下来我们准备开始进入Linux操作系统的第二个模块的学习&#xff0c;不过在学习之前我们需要对如下进行简单的配置&#xff0c;通过外接辅助软件MobaXterm来进行虚拟操作系统的访问。接下来的课程我们会一直在MobaXterm中进行命令和相关知识的学习。 一、准备阶段 1.1 软件 …

学习笔记JVM篇(三)

一、垃圾回收机制 垃圾回收&#xff08;Garbage Collection&#xff09;机制&#xff0c;是自动回收无用对象从而释放内存的一种机制。Java之所以相对简单&#xff0c;很大程度是归功于垃圾回收机制。&#xff08;例如C语言申请内存后要手动的释放&#xff09; 优点&#xff…

数据清洗-缺失值填充-K-NN算法(K-Nearest Neighbors, K-NN算法)

目录 一、安装所需的python包二、采用K-NN算法进行缺失值填充2.1可直接运行代码2.2以某个缺失值数据进行实战2.2.1代码运行过程截屏&#xff1a;2.2.2填充后的数据截屏&#xff1a; 三、K 近邻算法 (K-Nearest Neighbors, KNN) 介绍3.1 K 近邻算法定义3.2 K 近邻算法的基本思想…

福建科立讯通信 指挥调度管理平台 SQL注入漏洞

北峰通信-福建科立讯通信 指挥调度管理平台 SQL注入漏洞 厂商域名和信息收集 域名&#xff1a; 工具sqlmap python sqlmap.py -u "http://ip:端口/api/client/down_file.php?uuid1" --batch 数据包 GET /api/client/down_file.php?uuid1%27%20AND%20(SELECT%20…

替换 Oracle ,江河信息用 TDengine 解决高基数查询写入问题

在数字经济快速发展的背景下&#xff0c;智慧水利作为重要的基础设施之一&#xff0c;正逐步成为提升水资源管理效率、优化生态环境的重要力量。江西省水投江河信息技术有限公司&#xff08;以下简称“江河信息”&#xff09;作为高新技术国有企业&#xff0c;坚定致力于打造数…