TQ2440 学习笔记—— 9、嵌入式编程基础知识【arm-linux-gcc 选项】

时间:2022-03-20 20:05:00

(韦东山——嵌入式Linux 应用开发完全手册)

自己刚开始看的时候,总是沉不下心,后面硬是硬着头皮看完!现在再重新看一遍,做下记录!方便以后阅读,因为有些东西挺容易忘的。

TQ2440 学习笔记—— 9、嵌入式编程基础知识【arm-linux-gcc 选项】


一、交叉编译工具选项说明

1、arm-linux-gcc 选项

一个C/C++ 文件要经过预处理、编译、汇编、和链接 等4个步骤才能变成可执行文件;在Windows 下我们只需要单机几个按钮即可编译,但在ARM平台上,我们必须使用交叉编译工具。


预处理:——得到 ” .i “文件。 使用的工具 arm-linux-cpp

编译:——将上述的” .i “文件“翻译”成汇编代码。 使用的工具为ccl(它的名字就是ccl,不是arm-linux-ccl)

汇编:——将上一步的代码翻译成符合一定格式的机器代码,在Linux系统上表现为ELF目标文件。用到的工具为arm-linux-as。

链接:——将上一步生成的OBJ文件和系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行文件。

    用到的工具arm-linux-ld。


TQ2440 学习笔记—— 9、嵌入式编程基础知识【arm-linux-gcc 选项】

其他后缀名的文件被传递给链接器,通常包括:“.o”、".a"(归档库文件)


在编译的过程中,除非使用“-c”,"-S"或“-E”选项,否则最后的步骤总是链接。

在链接阶段中,所有对应于源程序的   .o   文件、“-l” 选择指定的库文件、无法识别的文件名(包括指定的 .o 目标文件 和  .a  库文件)按命令                            行中的顺序传递给连接器。


2、总体选项

a、 -c

预处理、编译和汇编源文件,但是不作链接,编译器根据源文件生成OBJ文件。

b、-S

编译后即停止,不进行汇编。结果输出汇编文件。

c、-E

预处理后即停止,不进行编译。预处理后的代码送往标准输出。

d、-o file

指定输出文件为 file。无论是预处理、编译、汇编、还是链接,这个选项都可以使用。如果没有使用 -o 选项,默认的输出结果是:可执行文件为a.out。

e、-v

显示制作GCC 工具自身时的配置命令;同时显示编译器驱动程序、预处理器、编译器的版本号。


3、警告选项

“-Wall” 选项基本打开了所有需要注意的警告信息,比如没有指定类型声明、在声明之前就使用的函数、局部变量除了声明就没有再使用等等。


4、调试选项

-g :以操作系统的本地格式产生调试信息,GDB能够使用这些调试信息。


5、优化选项

-O 或-Ol:

-O2:多优化一些

-O3:优化的更多

-O0:不优化


6、链接器选项

1、下面的选项用于连接OBJ文件,输出可执行文件或库文件。

(1)object-file-name 

如果某些文件没有特别明确的后缀,GCC 就认为它们是OBJ 文件或库文件。如果GCC 执行链接操作,这些OBJ文件将成为链接器的输入文件。

例子:gcc -o test main.o sub.o


(2)-llibrary

链接名为library的库文件。

例子:gcc -v -o test main.o sub.o 不明链接,用 -v 可以查看。


(3)-nonstartfiles 

不链接系统标准启动文件,而标准文件仍然正常使用。在编译bootloader、内核时,将用到这个选项。

例子:gcc -v -nonstartfiles -o test main.o sub.o


(4)-nostdlib

不链接系统标准启动文件和标准库文件,只把指定文件传递给链接器。这个选项常用于编译内核、bootloader等程序,它们不需要启动文件、标准库文件。

例子:gcc -v -nonstdlib -o -test main.o sub.o


(5)-static

在支持动态链接的系统上阻止链接共享库。


(6)-shared

生成一个共享OBJ 文件,它可以和其他OBJ 文件链接产生可执行文件。只有部分系统支持该选项。


(7)-Xlinker option

把选项 option 传递给链接器。


(8)-Wl, option

把选项option 传递给链接器。


(9)-u symbol

使链接器认为取消了symbol 的符号定义,从而链接库模块以取得定义。


7、目录选项

下列选项指定搜索路径,用于查找头文件、库文件或编译器的某些成员。

(1)-Idir

在头文件的搜索路径列表中添加dir 目录。


(2)-I-

任何在“ -I- ” 前面用“ -I- ”  选项指定的搜索路径只适用与“#include "file" ”这种情况;它们不能用来搜索“#include<file>” 包含的头文件。


(3)-Ldir

在“ -I ” 选项的搜索路径列表中添加dir 目录。


(4)-Bprefix

这个选项指出在任何处寻找可执行文件、库文件以及编译器自己的数据文件。