【嵌入式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

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。