GNU编译器生成目标过程的阶段:预编译、编译、汇编和链接
阶段
|
输入
|
输出
|
GCC示例
|
预编译
|
*.c
|
*.i
|
gcc -E test.c -o test.i
|
编译
|
*.i
|
*.s
|
gcc -S test.i -o test.s
|
汇编
|
*.s
|
*.o
|
gcc -c test.s -o test.o
|
链接
|
|
*.o
|
* gcc test.o -o test.o |
GCC的格式
$ gcc test.c -o test
$ gcc -c test.c
$ gcc -o image first.c second.c third.c
有用的选项
1. 例:源程序保存在./src中,头文件保存在同一等级的./inc中。可以在./src中编译文件并告诉gcc相应的头文件保存在./inc,具体如下:
$ gcc test.c -I../inc -o test
可以重复使用I格式来包含多个目录,如下所示:
$ gcc test.c -I../inc -I../../inc2 -o test
2. 可以在编译时候指定符号常量,如在源程序中或者头文件定义了符号常量
#define TEST_CONFIGRATION
可以在命令行中使用-D选项来这样子定义:
$ gcc -D TEST_CONFIGRATION test.c -o test
它的有点在于不必修改源程序就可以改变程序的行为。
编译警告
1. 最经常使用的检查普通警告的选项是-Wall,这个选项打开所有类型的警告。
$ gcc -Wall test.c -o test
2. 大多数错误选项都有一个否定形式用来将他们关掉(如果他们已默认打开或者在-Wall选项的控制下打开了)。如想打开-Wall且想关闭unused警告集可以输入:
$ gcc -Wall -Wno -unused test.c -o test
3. 选项-Werror使得编译器将所有的警告当作错误来处理。即报告错误并退出编译过程。
gcc优化
优化工作有三个个不相容的方向,选择优化时之可以选择其一:
- 将速度更快,文件更小作为目标
- 将速度更快作为目标,允许文件变大
- 将文件更小作为目标,允许程序变慢
优化等级
|
说明
|
-O0
|
不进行优化,默认等级
|
-O, -O1
|
尝试同时缩短编码时间和减小映像文件
|
-O2
|
比-O1更多的优化,但只在不导致文件增大时进行加快速度的优化,只在不导致速度变慢时进行减小文件的优化
|
-Os
|
以减小结果文件为优化目标。比-O2少一个可能导致文件增大选项。
|
-O3
|
比-O2多两个优化选项。
|
架构相关的优化
指定目标结构也是可以有效改进软件性能和大小。-mcpu选项告诉编译器生成针对特定cpu类型的指令。如:
$ gcc -mcpu=pentium2 test.c -o test
调试选项
如果想用符号调试器来调试代码,可以用-g标记来指定在映像中为GDB生成调试信息。-g可以带一个参数指定调试信息的格式。如:
$ gcc -gdwarf-2 test.c -o test
其他工具
1. size给出可执行映像或者中间目标文件的大小。给出text大小(指令数),data段,bss段。如:
$ gcc main.c -o main
$ size main
text data bss dec hex filename
1038 252 8 1298 512 main
$
2. objdump可以得到有关映像更加详尽的细节
$ objdump --syms test.o // 得到映像或者目标文件中的符号列表
$ objdump --disassemble test.o // 得到目标文件中找到的函数以及gcc为这些函数分别生成的指令。
3. nm可以有助于理解目标文件中出现的符号。它列出各个符号以及根据符号的类型列出相应的细节信息。
分享到:
相关推荐
制作GNU-ARM交叉编译工具链 一些记录
msys ,这是一个在windows上运行linux命令(比如gnu 编译工具链) 的shell 程序,由于外网较慢,所以请csdn帮忙
带硬件浮点的ARM9使用的交叉编译工具链arm-vfp-linux-gnu-4.3.2的源码包和安装方法说明。可以用于对LPC3250的交叉编译
arm-xilinx-linux-gnueabi 交叉编译工具链。可在编译ZED Board等其他使用ZYNQ芯片的系统的内核时使用
瑞萨e2-studio用到的编译工具链。搭建环境需要的工具链。能用于RZ/L1系列
龙芯loongarch 架构交叉编译工具链最新1.2版本,loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.2.tar
Codescape.GNU.Tools.Package.2017.10-05.for.MIPS.MTI.Bare.Metal.CentOS-5.x86_64
从github.com/raspberrypi/tools完整下载的主分支,直接git太慢还容易失败,特意分享出来,实测在Ubuntu 18上安装x64工具链可用,gcc版本:4.8.3. 文件300M+,不能上传大于220M的,尝试过解压后分卷,会导致安装有...
riscv-gnu-toolchain, RISC V的GNU工具链,包括 GCC risc-v-编译器工具链 这是 risc v C 和 C++ 交叉编译器。 它支持两种生成模式: 通用 elf/newlib工具链和更高级的linux elf/glibc工具链。获取源这个库使用子模块...
恒玄BES2300编译工具链
riscv32-unknown-elf-gcc交叉编译工具链,基于riscv-gnu-gcc进行编译。 版本8.2.0. 工具链大小为340M,超出了240M的限制,分成了2个资源进行上传,需要将第一部分下载,然后放一起才可以解压。
AARCH64 交叉编译工具链 gcc-linaro-11.2.1-2021.10-x86_64_aarch64-linux-gnu.tar.xz
riscv32-unknown-elf-gcc交叉编译工具链,基于riscv-gnu-gcc进行编译。 版本8.2.0. 工具链大小为340M,超出了240M的限制,分成了2个资源进行上传,需要将第二部分下载,然后放一起才可以解压。
包含Makefile的完整工程。 也同样可以在vs2022上运行,需要自己建立vs工程。同样支持gnuc工具编译
stm32f103ze-gnu使用gnu工具链编译和调试stm32f103ze开发板编译scons调试启动openocd openocd启动调试器arm-none-eabi-gdb bin/demo.elf -x openocd.gdb
还有其它平台使用如 Ant、Automake、CMake等等,而GNU社区也有自己的自动化编译工具,它就是 GNU make。很早之前深谙自动化编译的重要,只是一直没有机会写一篇相关的文章,这次真的是巧遇了,@亦楠 同学在《head...
ARM Linux交叉编译工具链,arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
该资源为博主自己生成的arm交叉编译工具,能够在正常使用。博主使用四五年了,没遇到什么问题,希望对大家有用吧。如果谁需要mips的,请留言。 解压命令: tar xvf arm-cross-tools-gnu.tar.gz(或者鼠标直接解压)
此工具是crosstool-ng源码包,可以制作arm交叉编译工具链等,智能选择组件包,比如gnu libgcc,binutils等。
GNU-MSVC-包装器Visual Studio 2010 SP1(可能更新)的 GNU 工具链包装器。 允许通过自定义编译器标志使用 GNU 工具链进行构建,并保持 MSVC 工具链完整。