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

链接脚本.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张图片

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文件

你可能感兴趣的:(嵌入式系统)