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

时间: 2024-08-09 20:50:45

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

嵌入式Linux ARM汇编(六)——GNU ARM汇编编程

嵌入式Linux ARM汇编(六)--GNU ARM汇编编程 不同的汇编器对汇编语言的语法要求不一样.目前常用的ARM汇编环境有以下两种: A.ARM ASM:ARM公司的汇编器,适合在Windows平台下使用 B.GNU ARM ASM:GNU交叉编译工具链中的汇编器,适合于Linux开发平台. GNU汇编器是GNU工具集的一部分,用于将汇编语言文件转化为二进制obj文件.GNU汇编器针对的是多种处理器架构,这意味着GNU汇编器的语法不同于ARM工具链的汇编器. 一.GUN ARM汇编指令格式

嵌入式Linux ARM汇编(七)——C语言与ARM汇编混合编程

嵌入式Linux ARM汇编(七)--C语言与ARM汇编混合编程 在嵌入式系统开发中,目前使用的主要编程语言是C和汇编.在大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较好,便于人的理解,而且有大量的支持库.但是很多地方还是要用到汇编语言,例如开机时硬件系统的初始化,包括CPU状态的设定,中断的使能,主频的设定,以及RAM的控制参数及初始化,一些中断处理方面也可能涉及汇编.另外一个使用汇编的地方就是一些对性能非常敏感的代码块,这是不能依靠C编译器的生成代

嵌入式 Linux系统编程(一)——文件IO

嵌入式 Linux系统编程(一)--文件IO 一.文件IO概念 linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件IO操作.不带缓存的属于直接调用系统调用(system call)的方式,高效完成文件输入输出.它以文件标识符(整型)作为文件唯一性的判断依据.这种操作不是ASCI标准的,与系统有关,移植有一定的问题.而带缓存的是在不带缓存的基础之上封装了一层,维护了一个输入输出缓冲区,使之能跨OS,成为ASCI标准,称为标准IO库.不带缓存的方式频繁进行用户态 和内核

嵌入式 Linux系统编程(二)——文件描述符控制函数fcntl

嵌入式 Linux系统编程(二)--文件描述符控制函数fcntl 由于fcntl函数实在过于灵活和复杂,本文将fcntl函数从文件IO中单独列出来,便于详细解读.函数原型如下: #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); fcntl函数用于控制操作文件描述符fd,对文件描述符的控制操作由cmd控制命令来控制,arg参数为可选参数,是否需要arg参数取决于控制命令

转:嵌入式linux启动时运行的inittab文件

嵌入式系统下的linux启动配置文件,不同与普通的PC linux启动配置,启动相关文件与文件的内容也要少得多.嵌入式系统下的linux启动过程一般是: 1 在bootloader中制定各种要求传给linux内核的参数,制作ramdisk或ramfs文件系统,并在开机后首先mount上,该文件系统主要负责包含启动运行的配置文件,嵌入式系统主要是/etc/inittab和/etc/rc文件: 2 在init进程启动后,进程首先执行/etc/inittab文件,该文件语法下面介绍,一般包括三项内容就

linux中软、硬链接文件比较

硬链接文件特征: 1.拥有相同的i节点和存储block块,可以看作是同一个文件: 2.可以通过i节点识别 3.不能跨分区 4.硬链接不能链接目录 5.修改任意文件另一个都变 6.删除源文件,硬链接能继续使用 语法: ln  源文件  目标文件 软链接文件特征: 1.类似于Windows快捷方式 2.软链接拥有自己的i节点和block块,但是数据块中只保存源文件的文件名和i节点号,没有实际的文件数据: 3.软链接的文件权限为rwxrwxrwx 4.修改任意文件,另一个都改变 5.删除原文件,软链接

【嵌入式Linux+ARM】ARM体系结构与编程(ARM汇编指令)

自己的一些简单的总结,也是最常用的ARM汇编指令,之后也会不断的补充完善. 1. 汇编系统预定义的段名 .text    @代码段 .data   @初始化数据段 .bss    @未初始化数据段 需要注意的是,源程序中.bss段应该在.text之前. 2.定义入口点 汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点. .text .global _start _start: 3 .word用法 word expression就是在当前位置放一个wo

【嵌入式Linux+ARM】GPIO操作

1.GPIO介绍 GPIO(general purpose i/o ports)意思为通用输入/输出端口,通俗的说就是一些引脚. 我们可以通过它们输出高低电平 或 读入引脚的状态. s3c2440中有130个I/O端口,分为A~J共9组,GPA.GPB...... GPJ 2.GPIO寄存器 既然要操作GPIO,必须对相应的寄存器进行操作,2440中gpio寄存器有: GPxCON--选择引脚功能(输入.输出.保留等) GPxDAT--用来读写引脚 GPcUP --某一位是1时,相应的引脚无内部

【嵌入式Linux+ARM】硬件相关基础知识(门电路_UART_I2C_SPI)

比较基本的一些知识,就算再怎么水,一些基本的电路常识还是需要懂的,需要自己慢慢的积累,实际工作中需要好好积累硬件相关的知识: 正文开始: 1.门电路 与门.或门.非门的几个标志需要记住,特别是后面两个不要混淆,自己画了一遍: 实际电路中可以组合使用:如与非门.或非门等复杂电路. 这些是比较简单的,做个简单的复习: 与门:1 1-->1      1 0-->0      0 1-->0     0 0-->0 或门:1 1-->1      1 0-->1      0