.lds链接脚本以及编译流程分析
程序员文章站
2022-03-05 16:54:42
...
链接脚本.lds文件
作用:控制输出文件在内存中的排布
最简单的连接脚本
SECTIONS{
. = 0X10000000;
.text : {*(.text)}
. = 0X30000000;
.data ALIGN(4) : { *(.data) }
.bss ALIGN(4) : { *(.bss) }
}
SECTIONS中定义输出文件的内存布局,编译出的代码一般是有text段、data段、bss段、和rodata段。代码段连接到0X10000000,数据段连接到0X30000000上。
- '.'为赋值符号
- .text : 是段名
- *(.text) ,星号表示通配符,表示所有输入文件的.text段都放入.text中。
- ALIGN(4),表示4字节对齐
以IMX6U处理器为例
SECTIONS{
. = 0X87800000;
.text :
{
start.o
*(.text)
}
.rodata ALIGN(4) : {*(.rodata*)}
.data ALIGN(4) : { *(.data) }
__bss_start = .;
.bss ALIGN(4) : { *(.bss) *(COMMON) }
__bss_end = .;
}
start.o包含一个需要执行的指令,所以要链接在前面:
- __bss_start 保存bss段的起始地址
- __bss_end 保存bss段的结束地址
源代码编译成可执行程序经历的过程
1.预编译的过程gcc -E main.c -o main.i
- 处理所有的#define #if #endif #ifdef #elif #else
- 去掉所有的注释
- 保留#pragma编译器指令
- 产生行数和文件标识,有利于编译器抛出错误提示
- .c文件预编译生成.i文件
- .cpp文件预编译生成.ii文件
2.编译的过程gcc -s main.c -o main.s
- 词法分析:分解生成一系列的记号
- 语法分析:生成语法树,分析语法错误
- 语义分析:对表达式是否有意义做判断
- 优化: 调整指令,优化
- 目标代码生成: 将中间代码转变成汇编
- 目标代码优化:寻找合适的寻址方式,用位移代替乘法,删除多余的指令
- 生成.s文件的汇编代码
3.汇编的过程gcc -c main.c -o main.o
- 将汇编文变成机器指令(根据对照表转化)——通过汇编器AS完成
- 生成.o文件
4.链接的过程gcc main.o -o main
- 代码是模块化的
- 通过链接链接在一起,将各个.o文件链接起来(windows是obj文件)
- 重新分配section空间,每个.o文件都有自己独立的.text段和.data段,链接器生成的可执行文件中需要对text段和data段空间进行划分。
- 目标文件.o通过和库进行链接可以得到.out文件
上一篇: ESP32-CAM入手新玩(2)
下一篇: 加入线程