交叉编译工具的使用
==========================
交叉编译工具集位于/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
如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。