arm-linux-gcc选项
一个c文件要经过预处理、编译、汇编和连接等4步才能那个变成可执行文件。
预处理:
以#号开头的命令被称为预处理命令,如包含命令#include、宏定义命令#define、条件编译命令#if, #ifdef等。预处理就是将要抱哈那个的文件插入源文件中、
将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些代码输出到一个“.i”文件中等待进一步处理。预处理将用到arm-linux-cpp工具
编译:
编译就是代码翻译成汇编代码,比如上述的“.i”文件。所用到的工具是ccl
汇编:
汇编就是将编译阶段输出的汇编代码翻译成符合一定格式的机器代码,在linux系统能够上面一般表现为
ELF目标文件(OBJ文件),用到的工具为arm-linux-as
连接:
链接就是将上述生成的OBJ文件和系统库OBJ问年连接起来,最终生成可以在特定平台运行的可执行文件,用到的工具为arm-linux-ld
对于arm-linux-gcc
加上-v选项,可以观看编译的细节
-c 预处理、编译和汇编源文件,但是不做链接,编译器根据源文件生成OBJ文件。
-S 编译后即停止,不进行汇编
-E 预处理后即停止,不进行编译。
-o file 指定输出文件为file
arm-linux-ld用于将多个目标文件、库文件连接成可执行文件。
其中 “-T”选项可以直接使用它来指定代码段、数据段、bss段的起始地址,也可以用来指定一个连接脚本,在连接脚本中进行更复杂的地址设置。
-T选项只用于连接Bootloader、内核等“没有底层软件支持”的软件;连接运行于操作系统之上的应用程序时,无需指定-T选项,他们使用默认的连接方式进行连接。
-Ttext startaddr 代码段的其实地址为startaddr
-Tdata startaddr 数据段的起始地址为startaddr
-Tbss startaddr bss段的起始地址为startaddr
arm-linux-ld -Ttext 0x00000000 -g led_on.o -o led_on_elf
它表示代码段的运行地址为0x00000000, 由于没有定义数据段、bss段的起始地址,他们被一次放在代码段的后面。