makefile使用.lds链接脚本以及 $@ ,$^, $,< 解析
先来分析一个简单的.lds链接脚本
例1,假如现在有head.c init.c nand.c main.c这4个文件:
1.1 首先创建链接脚本nand.lds:
SECTIONS {
firtst 0x00000000 : { head.o init.o nand.o}
second 0x30000000 : AT() { main.o }
}
SECTIONS { ... } 用来描述输出文件的内存布局。
这个脚本里规定了两个段,firtst和cecond
0x00000000 0x30000000
表示链接地址或运行地址,指程序在SRAM、SDRAM实际运行的地址,也就是使PC等于这个地址。
这里指head.o init.o nand.o的加载地址为0,运行地址在0x00000000,main.o运行地址在0x30000000
AT(4096)
表示加载地址或存储地址,指程序编译后存放的地址,一般存在ROM、FLASH中,也就是运行这个指令时,会先将4096地址~(4096+2048)地址处的内容复制到0x30000000处运行(因为已经初始化了SDRAM以及Nand Flash)。
这里指main.o的加载地址为Nand Flash里的地址4096,运行地址在SDRAM里的地址 0x30000000。
1.2 制作Makefile
objs := head.o init.o nand.o main.o nand.bin : $(objs)
arm-linux-ld -Tnand.lds -o nand_elf $^
arm-linux-objcopy -O binary -S nand_elf $@
arm-linux-objdump -D -m arm nand_elf > nand.dis %.o:%.c
arm-linux-gcc -Wall -c -O2 -o $@ $< %.o:%.S
arm-linux-gcc -Wall -c -O2 -o $@ $< clean:
rm -f nand.dis nand.bin nand_elf *.o
其中 objs 是代表的一个变量,表示obj文件,也可以是objects, OBJECTS, objs, OBJS, obj, 或是 OBJ,后面就可以使用$(objs)来使用这个变量了。
$@ 目标文件
$^ 所有的依赖文件
$< 第一个依赖文件
例如: arm-linux-ld -Tnand.lds -o nand_elf $^ <<—— 等价于 ——>> arm-linux-ld -o nand_elf head.o init.o nand.o main.o
%.o:%.c 表示所有的.o文件,依赖于对应的.c文件
%.o:%.S 表示所有的.o文件,依赖于对应的.S文件
当有多个.o文件时,这时候.lds链接脚本 又该如何安排它们在可执行文件中的顺序?
这里就需要将多个目标文件的.text、.data和.bss等段链接在一起而链接脚本文件是告诉链接器从什么地址开始放置这些段
- .text:代码段,存放程序执行代码的一块内存
- .data:读/写数据段,存放已初始的全局变量或静态变量的一块内存
- .rodata:只读数据段,存放只读数据段,比如全局const变量和#define定义的变量
- .bss:存放未初始化的全局变量或静态变量,这里的变量存放只是用来预留位置,并不占用空间
常用命令:
ENTRY(SYMBOL);将SYMBOL的值设置成入口地址。一般设置为_start。
OUTPUT(FILENAME); 定义输出文件的名字。可以用它来指定默认的输出文件名称。当然我们一般都用手动-o进行指定,如果我们没有进行手动指定的话,输出文件名称就以这个FILENAME为输出文件名。
STARTUP(filename);指定filename为第一个输入文件。
OUTPUT_FORMAT(default, big, little);定义3种输出文件的格式。若有命令行选项-EB(大端),则使用第二个输出格式,有命令行指定-EL(小端),则使用第三个格式。否则使用默认的default输出格式。
OUT_ARCH(arch);设置输出文件的体系架构。
SECTIONS :最重要的,最基本的,也是最主要的命令,它告诉链接器如何把输入文件的各个section输出到目标文件中的各个section中去。
例2:分析 board/100ask24x0/u-boot.lds链接脚本
OUTPUT_ARCH(arm) //设置输出文件的体系架构。
ENTRY(_start) //将_start这个全局符号设置成入口地址。
SECTIONS //输出文件内容布局
{
. = 0x00000000; //指定地址0x00000000 . = ALIGN(4); //代码以4字节对齐
.text : //指定.text section段(位于0x00000000)
{
cpu/arm920t/start.o (.text) //添加第一个目标文件: cpu/arm920t/start.o里面的.text代码段
board/100ask24x0/boot_init.o (.text) //添加第二个目标文件: board/100ask24x0/boot_init.o里面的.text代码段
*(.text) // *(.text) 表示添加剩下的全部文件的.text代码段
} . = ALIGN(4);
.rodata : { *(.rodata) } //指定.rodata section段(位于0x00000000+.text section),将所有的.rodata只读数据段合并成一个.rodata只读数据段 . = ALIGN(4);
.data : { *(.data) } //指定读写数据段, *(data):添加所有文件的数据段 . = ALIGN(4);
.got : { *(.got) } //指定got段,got段是uboot自定义的一个段 . = .;
__u_boot_cmd_start = .; //把__u_boot_cmd_start赋值为当前位置, 即起始位置
.u_boot_cmd : { *(.u_boot_cmd) } // u_boot_cmd段,所有的u-boot命令相关的定义都放在这个位置
__u_boot_cmd_end = .; // u_boot_cmd段结束位置 . = ALIGN(4);
__bss_start = .; //把__bss_start赋值为当前位置,即bss段的开始位置
.bss : { *(.bss) } //指定bss段,这里NOLOAD的意思是这段不需装载,仅在执行域中才会有这段
_end = .; //把_end赋值为当前位置,即bss段的结束位置
}
随机推荐
- PDF修改器
亲测可用的绿色版PDF修改器供大家分享使用 下载地址:http://pan.baidu.com/s/1pLPnhQb
- Nagios部署与配置
Nagos是一款开源电脑系统和网络监视工具,能够有效监控windows,linux,Uninx的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报警第一时间通知运维人员 ...
- 测试与开发如何有效沟通,QC11(HP ALM 11)的简单使用记录
笔者所在的项目组使用的缺陷管理工具是HP的QC11,作为测试人员,为了与开发一起跟随Bug的一生,简单的写了使用流程,这里记录一下,主要是让开发人员熟悉一下. 首先使用账户登录QC,如地址: http ...
- akoj-1162-计算表达式
计算表达式 Time Limit:1000MS Memory Limit:65536K Total Submit:14 Accepted:7 Description 对于一个不存在括号的表达式进行计 ...
- [bzoj 1409] Password 矩阵快速幂+欧拉函数
考试的时候想到了矩阵快速幂+快速幂,但是忘(bu)了(hui)欧拉定理. 然后gg了35分. 题目显而易见,让求一个数的幂,幂是斐波那契数列里的一项,考虑到斐波那契也很大,所以我们就需要欧拉定理了 p ...
- [Poi2010]Monotonicity 2 线段树
这道题考试的时候先打了个dfs暴力.又打了个O(n²)的动规.然后竟然心血来潮拍了一下..明明知道过不去的...然后水了50分(20个测试点这么多啊啊啊啊). 因为它已经提前给你如果长度为i时下一位的 ...
- 学习笔记TF051:生成式对抗网络
生成式对抗网络(gennerative adversarial network,GAN),谷歌2014年提出网络模型.灵感自二人博弈的零和博弈,目前最火的非监督深度学习.GAN之父,Ian J.Goo ...
- 打造基于Clang LibTooling的iOS自动打点系统CLAS(二)
1. 配置LLVM和Clang 在这篇文章里,我们会基于上一篇所述的方案进行展开,详细讲解如何从0开始创建一个基于Clang LibTooling的编译器前端工具.在开始之前,我们假设你已经基本了解何 ...
- 利用OpenCms9提供的模块创建新站点
OpenCms 9中提供b一个Demo,Demo使用了alkacon的bootstrap模板.如果已经安装了OpenCms 9,可以登陆http://localhost:8080/opencms/op ...
- 细说 Azure Storage 的冗余策略
当我们想要把应用搬到云端的时候,首先要关注的便是数据的安全性.当然所有的云服务厂商都会对用户数据承诺一个非常高的安全性,但万一出现意外呢?我们是不是还要有适当的应对方案?比如今年的3月8日晚间,Azu ...