工程中编写自己的makefile---3 交叉编译工具

1        交叉编译工具

一个C/C++文件要经过预处理(preprocessing),编译(compilation),汇编(assembly),连接(linking);

1.1             概述

1,预处理

         .c  >> .i

         将要包含(include)的文件插入源文件中,将宏定义展开,根据条件编译命令选择要使用的代码,最后将这些代码输出到一个”.i”文件中等待进一步处理;一般用到arm-linux-cpp

2,编译

         .i  >> .s

         把C/C++的代码(比如上面的”.i”文件)”翻译”成汇编代码,所用到的工具是 ccl

3,汇编

         .s  >> .o

         将上一步中的汇编代码翻译成符合一定格式的机器可识别但不能执行的机器代码,在linux系统上一般表现为 .o 后缀的目标文件(OBJ文件),用到的工具是arm-linux-as ; ”反汇编”是指将机器代码装换为汇编代码,在调试程序时常用到;

4,连接

       .o  >>  elf

         将多个 .o 文件和系统库文件链接成为可在特定平台运行的可执行文件,(linux下为ELF格式),用到的工具为 arm-linux-ld

1.2             arm-linux-gcc选项

1.2.1        总体选项

1-o  file

指定输出的文件为file; 但只能指定一个输出文件;

 

2-c

         输出 .o 文件

编译或汇编源文件,但不做连接,编译器输出对应于源文件的目标文件,默认情况下,GCC通过使用”.o”替代源文件名的后缀”.c”,”.i”,”.s”等,产生OBJ文件名; 可以使用”-o”选项选择其他的名字;

gcc 忽略 –c 选项后面任何无法识别的输入文件(不编译或汇编)

 

3,-S

         输出 .s 文件

编译后即停止,不进行汇编,对于每个输入的非汇编语言文件,输出结果是汇编语言文件; 默认情况下,GCC通过使用”.s”替代源文件名的后缀”.c”,”.i”,等,产生汇编文件名; 可以使用”-o”选项选择其他的名字;

 

4,-E

输出 .i 文件

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

 

5,-v

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

 

6,-pipe

在编译过程的不同阶段间使用管道而非临时文件进行通信

 

7,-x        language

明确指出后面输入文件的语言为 language (而不是从文件后缀得到默认选择)

警告选项

 

8-Wall

         基本打开了所有需要注意的警告信息;

 

9,调试选项

         -g

         以操作系统的本地格式(stabs,COFF, XCOFF,或DWARF).产生调试信息. GDB能够使用这些调试信息.

 

10,优化选项

         -O,-O0,-O1,-O2,-O4,优化;

1.2.2        连接器选项

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

1,object-file-name

         gcc  -o test  main.o  sub.o    其中: main.o  sub.o就是输入的文件

 

2-l(小写l)library

    连接名为library的库文件,常接”-L”指定的库搜索路径; 指定期望连接的库的名字,注意!!!文件的顺序就是链接的顺序

 

3,-nostartfiles

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

 

4,-nostdlib

         不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器,在编译bootloader,内核时将用到这个选项;

 

5-static

         连接静态库是使用该选项

 

6-shared

         生成一个共享OBJ文件,他可以和其他OBJ文件连接产生可执行文件,当不想以源代码发布程序时,使用”-shared”选项生成库文件;

1.2.3        目录选项

1I(大写i)dir

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

 

2L(大写l)dir

常接”-L”指定的库文件搜索路径

1.2.4        库选项

参考4.1.1节

1.3             arm-linux-ld选项

arm-linux-ld 用于将多个目标文件,库文件连接成可执行文件,

1.4             arm-linux-objcopy选项

        用来复制一个目标文件的内容到另一个文件中;可以使用不同的源文件格式来输出目的文件,及可以进行格式转换;

1,Input-file  outfile

         分别表示输入目标文件(源目标文件)和输出目标文件(目的目标文件);如果没有明确指出输出目标文件,则将输出目标文件覆盖到输入目标文件;

 

2,-I bfdname或--input-target=bfdname

         用来指明源文件格式;

 

3,-O bfdname或--output-target=bfdname

用来指明目标文件格式;

 

4,-F bfdname--target=bfdname

         指明源文件格式目标文件格式,只进行复制不转换;

 

5,-S 或 --strip-all

         不从源文件中复制重定位信息和符号信息到目标文件中去

6,-g 或--strip-debug

         不从源文件中复制调试符号到目标文件中去

1.5             arm-linux-objdump选项

用于显示二进制文件信息,常用来查看反汇编代码;

1,-b  bfdname

         指定目标码格式,

2,-d

         反汇编可执行段

3,-D

         反汇编所有段

4,-f

         显示文件的整体头部摘要信息;

5,-h

         显示文件的各个段头部摘要信息;

6,-i

         显示支持的目标文件格式和CPU架构,他们在“-b”“-m”选项中用到

7,-m machine

         指定反汇编目标文件时使用的架构;

例如:

将ELF格式的文件转换为反汇编文件

         arm-linux-objdump–D  elf_file > dis_file

将二进制文件转换为反汇编文件

         Arm-linux-objdump–D  –b binary  –m arm bin_file>dis_file

 

发布了51 篇原创文章 · 获赞 106 · 访问量 33万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章