【嵌入式Linux+ARM】阶段性总结(Makefile 链接文件)

1.arm-linux-ld

arm-linux-ld 的 -T 选项用来指定链接地址;

-Ttext——指定代码段

-Tdata——指定数据段

-Tbss——指定bss段

arm-linux-ld -Ttext 0x30000000 -g led_on.o -o led_on

也可以用来指定一个链接文本,如*.lds ,举例如下:

SECTIONS{

. = 0x30000000//设置当前运行地址

.text : {*(.text)} //所有输入文件的代码段 被集合在一起 起始运行地址为0x30000000

.rodata : {*(.rodata)}

.data : {*(.data)}

.bss ALIGN(4) : {*(.bss) *(COMMON)} //ALIGN指定对齐的字节数

first 0xB0000000 : AT(4096) {led.o} //first段运行地址(重定位地址)为0xB0000000

//AT指定的是存放在编译后镜像文件4096位置处

}

注意区分运行地址和加载地址!!!

2.arm-linux-objcopy 与 arm-linux-objdump

arm-linux-objcopy -O binary -S elf_file bin_file //把elf文件转换为bin文件

arm-linux-objdump -D elf_file > dis_file //把elf文件转换为反汇编文件

arm-linux-objdump -D -b binary -m arm bin_file > dis_file//二进制文件转换为反汇编文件

3. 反汇编代码

4bc: e3a0244e mov r2, #1308622848;0x4e000000

0x4e000000

解释:

4bc 、 4c0是代码的运行地址 就是说运行前 这些指令必须位于内存中这些地址上;

e3a0244e是机器码 CPU用到的、内存中保存的都是机器码;

0x4e000000是1308622848的十六进制表示;

4. 立即数计算方法

5. Makefile基础加强

:=赋值的变量为立即变量

+=的变量,,如果在此之前有:=定义过,那它就是立即变量;否则就是延时变量;

常用Makefile函数:

$(subst from, to, text)——把text中所有to用from替换

$(patsubst from, to, text)——同上,可以使用通配符 如$(patsubst %.c, %.h, 1.c 2.c)得到1.h 2.h

$(strip string)——去除前导和结尾空格

$(filter pattern…, text)返回符合pattern的字,如$(filter %.c, 1.c 2.h 3.c) ——得到1.c 3.c

$(findstring find, in)——从in中搜索find,找到则返回find,找不到返回NULL

$(basename names….)——得到每一个文件名中除后缀外的一切字符 $(basename s/1.c s/2 3)得到s/1 s/2 3

$(dir names…)——抽取每个文件名的路径部分

$(notdir names…)—抽取每个文件名除路径外一切字符——真正的文件名

$(suffix names…)—抽取每个文件名的后缀

$(addsuffix suffix, names…)——添加后缀$(addsuffix %.c 1 2)——得到1.c 2.c

$(addperfix suffix, names..)——添加前缀$(addperfix src/, 1 2)——得到src/1 src/2

$(wildcard pattern)——可以使用*通配符,如当前目录下有1.c 2.c 3.h;则var := $(wildcard *.h)得到 3.h

$(shell ls *.c)——用于执行shell命令

例子:

src := $(shell ls *.c)//shell函数用于执行shell命令objs:= $(patsubst %.c, %.o, $(src)) //所有的.c文件 用.o文件代替 %号可以和任意个数的字符相匹配;test : &(objs)gcc -o &@ $^%.o:%.cgcc -c -o &@ &^clean:rm -rf test *.o

原创文章,转载请著名出处:

为你的快乐而快乐的是朋友,为你的难过而难过的才是你的知己。

【嵌入式Linux+ARM】阶段性总结(Makefile 链接文件)

相关文章:

你感兴趣的文章:

标签云: