链接过程(1) 地址空间分配与链接脚本
将所有的可重定位目标文件合并、组装成可执行目标文件
链接过程:
- 地址空间分配
- 符号解析:强符号与弱符号
- 重定位
1. 地址空间分配
- 扫描所有目标文件,从各个文件段表中获取各个文件代码段、
数据段信息:大小、地址等 - 从指定的链接地址开始,按照代码段、数据段、bss段顺序将
各个目标文件的同类型段合并,重新计算各个段的长度和位置
2. 链接脚本
链接脚本规定了各个段的组装顺序、起始地址、位置对齐等
规定输出可执行文件的格式、运行平台、入口地址等信息
链接器根据链接脚本进行组装
2.1 链接脚本示例
OUTPUT_FORMAT(“elf32-littlearm”,
“elf32-bigarm”,“elf32-littlearm”) //输出ELF文件格式
OUTPUT_ARCH(“arm”) //输出可执行文件的运行平台为arm
ENTRY(_start) //程序入口地址
SECTIONS //各段描述
{
. = 0x60000000; //代码段起始地址
.text: { *(.text)} //代码段描述:所有.o文件的.text
. = 0x60200000; //数据段的起始地址
.data: { *(.data)} //数据段描述
.bss : { *(.bss)} //BSS段描述
}
2.2 不同开发环境下的链接脚本
2.2.1 IDE
链接器调用缺省的链接脚本来完成组装
应用开发人员,只关注业务逻辑实现,不用关心底层链接,程
序运行时由加载器加载运行
2.2.2 裸机、系统、汇编开发
根据开发板不同硬件配置,链接到指定位置,需要显式指定链接脚本,甚
至自己写链接脚本
3 链接地址
3.1 Linux环境下 gcc编译器:
0x08048000
3.2 Linux环境下 arm-linux-gcc:
0x00010000
3.3 交叉编译器 arm-linux-gcc
3.3.4 U-boot编译链接脚本:
./u-boot.lds
3.3.5 Linux 编译链接脚本:
arch/arm/boot/compressed/vmlinux.lds