【嵌入式Linux+ARM】阶段性总结(Makefile & 链接文件)
2019-07-12 16:42发布
生成海报
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
4c0: e3a0244e mov r3, #1308622848;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:%.c
gcc -c -o &@ &^
clean:
rm -rf test *.o
原创文章,转载请著名出处:http://blog.csdn.net/scottly1/article/details/39377763
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮