编译链接原理

1.预编译 .i
linux 命令:gcc -E main.c -o main.i

  1. 删除#define,并做文本替换
  2. #include递归展开头文件
  3. 处理预编译指令 #if #endif
  4. 删除注释
  5. 添加行号 文件标识
  6. 保留#pragma

2.编译 .s
linux 命令:gcc -S main.i -o main.s

  1. 词法分析
  2. 语法分析
  3. 语义分析
  4. 代码优化
  5. 生成汇编指令

3.汇编 .o
linux 命令:gcc -c main.s -o main.o

  1. 将汇编指令翻译成二进制
  2. 生成各个section
  3. 生成符号表

4.链接
linux 命令:gcc main.o -o main

  1. 合并所有文件的各个section,调整段大小及段的起始位置。合并符号表,进行符号解析,并给符号分配一个虚拟地址。
  2. 进行符号重定位,在使用符号的地方,全部替换成符号的虚拟地址。

汇编后的 .o 文件和链接后的 .o 文件有何不同

  • 汇编程序生成的 .o 目标文件,并不会立即执行,因为原本.c 或者 .cpp 文件中可能还引用了另一个文件中定义的符号,或者调用了某个库文件中的函数。
  • 链接的目的就是将这些文件对应的目标文件连接成一个整体,从而生成可执行的程序文件。

C语言中的强弱符号

一个项目可能有多个源文件,编译阶段都是每个文件单独编译的,可能在其他文件中存在强符号,所以没办法在编译期间确定具体的符号。因此将本文件的弱符号存放在COM块,而不是.bss段。

强符号:全局的已初始化的符号
弱符号:全局的未初始化的符号

强弱符号的选取规则:
  1. 两个强符号 编译报错
  2. 一个强符号 一个弱符号 选择强符号
  3. 两个弱符号 根据不同编译器处理方式不同

可扩展 objdump 和 readelf 的使用
1. man objdump
objdump - 显示二进制文件信息(.o 文件)

2. man readelf
在这里插入图片描述
readelf – 显示elf文件信息

LINUX 平台下三种主要的可执行文件格式:a.out(assembler and link editor output 汇编器和链接编辑器的输出)、COFF(Common Object File Format 通用对象文件格式)、ELF(Executable and Linking Format 可执行和链接格式)。

. elf格式介绍

Executable and linking format(ELF)文件是Linux系统下的一种常用目标文件(object file)格式,有三种主要类型:

(1)适于连接的可重定位文件(relocatable file),可与其它目标文件一起创建可执行文件和共享目标文件 (.obj or .o)

(2)适于执行的可执行文件(executable file),用于提供程序的进程映像,加载的内存执行。

(3)共享目标文件(shared object file),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。
(TL笔记复习)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值