ARM GNU工具链编译流程 C语言原文件 如何一步一步变成bin文件的? 这其中自然是利用编译工具链生成的,当然不同的编译工具链这个过程还是有所差别的。这里因为我们写的是ARM汇编程序,编译它我们自然需要采用ARM公司的ARM GNU 编译工具链,在此,我们以他为例,看看到底中间具体流程步骤是怎么样的? 我们看一下下面这张图,比较完整的告诉我们这个编译流程。 hello.c C语言原文件经过Gcc 工具 预处理 生成预处理文件hello.i,这里主要是做了些预处理工作,比如头文件包含合并,宏定义展开等工作hello.i 文件经过Gcc工具处理翻译生成hello.s汇编代码,C代码变成汇编代码hello.s 汇编文件 经过 AS 工具处理变成目标文件hello.o, hello.o属于二进制文件,也就是CPU能够解析执行的程序,但是不完整hello.o 经过 Ld 工具把目标文件变成完整的二进制文件hello,链接器ld的主要作用就是把一些其它和hello.o相关的目标文件也链接进来,形成完整可执行程序 以上就是整个大概的编译流程步骤。 下面我们来看看上面用到的这些工具命令的具体如何使用。 Gcc 常用参数:-E 输出预处理后的文件 -i-S 输出编译生成的汇编文件 .s-c 输出汇编文件生成目标文件-o 指定输出文件名-g 生成调试信息-On 优化等级,n属于0~3 ,n越大优化越高 -O0,不优化 样例: arm-none-eabi-gcc start.s -g -c -O0 -o start.o Ld 链接目标文件生成二进制文件 参数:-T 指定代码段,数据段,bbs段等的地址-Ttext addr 指定代码段在内存运行位置-Tdata addr 指定数据段在内存位置-Tbbs addr 指定bbs段在内存位置 样例: arm-none-eabi-ld start.o -Ttext 0x40000000 -o start.elf 注意:这里只是指示了代码段运行地址为0x40000000 (没有指明的话就是0x0),没有指明data,bbs段的位置,默认依次放到后面。 如果链接 复杂的时候,可以写一个专门链接脚本来具体化负责的链接规则。 -Txxxx.lds 这里xxxx.lds就是为链接脚本的文件名称 关于LDS链接脚本文件的编写语法又是一门新语言,另单独成文介绍。 objcopy 格式转换 -O fdname 指定输出格式 -S 去掉源文件的符号信息和relocation信息 arm-none-eabi-objcopy -O binary -S start.elf start.bin objdump 反汇编,查看格式 -d 反汇编 -x 以某种分类信息的形式把目标文件的数据组织(被分为几大块)输出 arm-none-eabi-objdump -x -d start.elf > start.dis 本文由晓亮Albert原创,欢迎关注,带你一起长知识!