ARM GCC常见用法
GCC是GNU的编译器套件(GNU Compiler Collection),在执行编译工作是,需要一下4步:
- 预处理器将源文件预处理后变为 .i 的文件
- 编译器将预处理后的 .i 文件转换成汇编文件( .s文件)
- 汇编器将汇编文件转换为可重定位的目标文件( .o文件 )
- 链接器将各个可重定位的目标文件链接生成为可执行的目标文件( .elf 文件)
参数介绍
- -S
只激活预处理器和编译器,将源文件编译成汇编代码
- -c
只激活预处理器,编译器和汇编器,将源文件变为可重定位的目标文件
- -o
指定输出文件的名字,GCC默认编译出的文件名为a.out
- -include filename
包含其它文件,相当于在代码中使用 #include <filename>
- -M
生成文件关联信息
- -llibary
指定编译时使用的库,例 gcc -lcurses hello.c
- -Ldir
指定编译时,搜索库的路径,不然仅在标准库的目录里找,dir即目录名称
- -O0,-O1,-O2,-O3
编译器优化的4个级别
- -g
指定编译器在编译时产生调试信息
- -static
禁止使用动态库
- -share
尽量使用动态库,生成出的文件更小,但须要对应系统具有动态库
使用举例
- 对源文件仅进行预处理操作
arm-none-eabi-gcc -E main.c -o main.i
- 将源文件编译成汇编代码
arm-none-eabi-gcc -march=armv7-m -S main.c -o main.s
- 将源文件编译成可重定位的目标文件
arm-none-eabi-gcc -march=armv7-m -c main.c -o main.o
- 将源文件编译成可执行的目标文件(.elf)
arm-none-eabi-gcc -march=armv7-m -specs=nosys.specs main.c -o main
- 将汇编代码编译成可执行的目标文件(.elf)
arm-none-eabi-as -march=armv7-m main.s -o main
- 由可执行的目标文件(.elf)生成反汇编代码(.dis)
arm-none-eabi-objdump -d main > main.dis
- 多个可重载目标文件生成可执行目标文件
arm-none-eabi-ld -T script.ld test1.o test2.o -o test //其中script.ld为链接脚本
- 多个可重载目标文件生成map文件
arm-none-eabi-ld -T script.ld test1.o test2.o -Map test.map
- 读取可执行目标文件(.elf)中的程序bin文件
arm-none-eabi-objcopy -O binary test.elf test.bin