您的位置:首页 > 其它

makefile使用.lds链接脚本以及 $@ ,$^, $,< 解析【转】

2018-01-12 14:57 267 查看
转自:http://www.cnblogs.com/lifexy/p/7089873.html

先来分析一个简单的.lds链接脚本

例1,假如现在有head.c init.c nand.c main.c这4个文件:

1.1 首先创建链接脚本nand.lds:

1 SECTIONS {
2   firtst      0x00000000 : { head.o init.o nand.o}
3   second     0x30000000 : AT(4096) { main.o }
4 }


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链接脚本

  

有什么不懂的或有误的地方欢迎指出,非常感谢

版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: