arm-linux-gcc 等交叉编译器的使用

交叉编译工具的使用

==========================

交叉编译工具集位于/usr/local/toolschain/4.5.1/bin目录下。

常用的工具如下:

arm-linux-as, arm-linux-gcc;

arm-linux-ld, arm-linux-objcopy;

arm-linux-objdump, arm-linux-nm;

 

 

(1)arm-linux-as

-----------------------

as汇编器的工作是将.s格式的汇编文件编译为.o文件;

例子:

$>vim /home/test/test.s

.text

.global _start

_start:

        mov r0, #3

        mov r1, #5

        add r2, r0, r1

_abc:

        .word 0x12345678

.end

 

$>arm-linux-as -o test.o  test.s

(指定输出文件为test.o,也可以指定成abc.o等)

 

(2)arm-linux-gcc

-------------------------

gcc并不只是c编译器,通过它可以综合完成预处理、编译、汇编、连接等各项工作,并最终输出可执行程序;

例子:

$>arm-linux-gcc hello.c

//直接输出可执行程序,默认文件名为a.out

 

常用选项(区分大小写):

-c

完成预处理、编译和汇编,不执行连接,生成.o文件

$>arm-linux-gcc hello.c -c

//默认输出hello.o

 

-S

完成预处理和编译,不进行汇编和连接,生成.s文件

$>arm-linux-gcc hello.c -S

//默认输出hello.s

 

-E

完成预处理后停止,不执行后续动作,预处理后的代码直接在控制台输出

$>arm-linux-gcc hello.c -E

//默认在控制台输出

 

-o filename

指定输出的文件名,和上面的选项配套使用

$>arm-linux-gcc hello.c -S -o abc.s

$>arm-linux-gcc hello.c -E -o hello.i

 

-v

显示编译的详细过程(verbose)

 

-Wall

打开所有的警告信息

在hello.c中增加一个没用的变量i,然后用-Wall测试:

$>arm-linux-gcc hello.c -Wall

hello.c: In function 'main':

hello.c:5: warning: unused variable 'i'

-v

显示编译的详细过程(verbose)

 

-Wall

打开所有的警告信息

在hello.c中增加一个没用的变量i,然后用-Wall测试:

$>arm-linux-gcc hello.c -Wall

hello.c: In function 'main':

hello.c:5: warning: unused variable 'i'

 

代码优化:

-O0: 不优化

-O1: 打开一定的优化选项

-O2: 除了不进行循环展开和函数内嵌,执行几乎所有的优化(常见)

-O3: 在O2的基础上增加了"-finline-functions"选项

 

-I/-L/-l

-I增加头文件的搜索路径(默认为/usr/include等)

-L增加库文件的搜索路径(默认为/usr/lib等)

-l指明程序要链接到的库,可以是动态库(.so)或静态库(.a)

例如:

$>arm-linux-gcc -I/var/include/ -L/var/lib/

  -labc -o hello hello.c

//在/var/test/include下检索头文件

//在/var/test/lib下检索库文件

//linux下的库文件都以lib开头,因此链接的库为libabc.so(如果没有动态库,则链接.a静态库)

 

-nostdlib

不连接系统标准启动文件和标准库文件,常用于编译uboot和内核。这些程序和普通的应用程序不同,不需要标准启动文件和库。

 

-static

链接静态库,而不是动态库。编译器会把整个的.a库加入应用程序

$>arm-linux-gcc -static -o hello hello.c

$>file hello(3)arm-linux-ld

------------------------

ld为链接器,用于将目标文件、库文件等链接成可执行的elf应用程序;

arm-linux-gcc在生成a.out时会默认调用ld;

编译较大型软件的常见用法是,由arm-linux-gcc生成多个.o文件,然后由arm-linux-ld统一生成一个可执行文件;

 

例子:

$>cd .../work/code-uboot/01led

$>arm-linux-as  -o  start.o  start.s

$>arm-linux-gcc -c  main.c -o main.o

$>arm-linux-gcc -c  led.c  -o led.o

$>arm-linux-ld  start.o  main.o  led.o -o led -Ttext  0x70003000

(最后生成的可执行应用程序为led)

 

 

(4)arm-linux-objcopy

------------------------------

文件格式转换工具;

常用于将elf格式的可执行应用程序转化为bin格式的程序;

例子:

$>arm-linux-objcopy -O binary led led.bin

//-O binary指明输出bin格式的应用程序

//最后面的两个参数分别为input-file和output-file

 

 

(5)arm-linux-objdump

-------------------------

常用于对.o文件或可执行文件进行反汇编;

常用选项:

-d

反汇编可执行段

-D

反汇编所有段

-f

显示文件的整体头部摘要信息

-h

显示文件中各个段的头部摘要信息

-m arm

指定反汇编时使用的架构

-b binary

指定要反汇编的文件格式

 

例子:

$>arm-linux-objdump -D led01

$>arm-linux-objdump -D -b binary -m arm led01.bin

 

(6)arm-linux-nm

显示.o或elf程序中的符号:

$>arm-linux-nm hello

 

如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值