欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

.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段的结束地址

源代码编译成可执行程序经历的过程

.lds链接脚本以及编译流程分析

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文件
相关标签: 嵌入式系统