读书笔记:程序员的自我修养—链接、装载与库

本文详细介绍了编译过程的五个主要阶段:预编译、编译、汇编、链接及它们的功能,包括如何处理宏定义、包含文件、生成汇编代码、创建目标文件以及解决模块间的引用关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译过程:

在这里插入图片描述

  1. 预编译。展开所有 # define 和条件 define 相关定义, 以及 # include 包含的文件[递归],删除注释、添加行号和文件名。 产生 .i 文件
  2. 编译[最核心]。 产生汇编语言代码 .s 文件。
  3. 汇编。 将汇编代码翻译成二进制 .o 文件。
  4. 链接。把各个模块之间的相互引用关系处理好,符号地址的引用。 主要是:地址和空间分配,符号决议,重定位。

引用其他模块的函数或者全局变量时不需要知道他们的地址,链接器会修正编译器产生的指令目标地址。
代码被编译&汇编成机器文件后, 指令常被放在代码段中, 即 .code & .text section, 全局变量和局部静态变量数据放在数据段中,即 .data section

在这里插入图片描述

代码段和数据段分开的好处:

  1. 指令是只读的,而数据是可读可写的。
  2. 空间局部性原理,利于性能。
  3. 由于指令是只读的,所以多个进程共用相同的DDL时,内存中只有一份代码段指令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值