00. 目录

01. GNU工具概述

​ 在Linux中,GNU Tools是主要的程序的开发工具,这组工具主要用于生成代码和分析程序。GNU Tools最重要的组成部分是GCC。GCC是GNU Compiler Collection的缩写,是一个非常优秀的跨平台编译器集合,支持x86、ARM、MIPS和PowerPC等多种目标平台,支持C、C++、Java、ADA、Fortran和Pascal等多种高级语言。

​ GCC能完成从C、C++、Objective-C等源文件向运行在特定CPU硬件上的目标代码的转换。对于通用计算机、一般使用GCC生成x86的可执行代码,对于嵌入式开发系统使用交叉编译GCC,生成目标机可以执行的程序。

02. 常用文本文件

*.c C语言源文件

*.C *.cxx *.cc C++语言源文件

*.i 预处理后的C语言源文件

*.ii 预处理后的C++语言源文件

*.s *.S 汇编语言文件

*.h 头文件

03. 常用二进制文件

*.o 目标文件

*.so 动态库

*.a 静态库

.c为后缀的文件,C语言源代码文件;

.a为后缀的文件,是由目标文件构成的档案库文件;

.C,.cc或.cxx 为后缀的文件,是C++源代码文件且必须要经过预处理

.h为后缀的文件,是程序所包含的头文件

.i 为后缀的文件,是C源代码文件且不应该对其执行预处理

.ii为后缀的文件,是C++源代码文件且不应该对其执行预处理

.m为后缀的文件,是Objective-C源代码文件;

.mm为后缀的文件是Objective-C++源代码文件;

.o为后缀的文件,是编译后的目标文件

.s为后缀的文件,是汇编语言源代码文件;

.S为后缀的文件,是经过预编译汇编语言源代码文件。

04. Binutils工具集

​ GCC是一组工具的集合,包含了预处理器、编译器、汇编器、连接器部分。当使用GCC的时候,将根据需要调用相应的工具。对于默认的文件名,GCC可以自动选择工具来完成文件处理过程。从C语言的源程序到可执行文件的转换,实质上是依靠GCC调用一系列工具完成的。

​ Binutils是一个二进制工具的集合,包含了汇编、链接以及一系列的辅助工具。binutils是辅助GCC的重要工具集,主要包含以下的工具。

as: GNU汇编器,用于将处理器的汇编格式代码转换成可执行代码,并存储到目标文件.o文件中

ld: GNU连接器,用于将一个或者多个目标文件(.o)、库组合成一个可执行的程序,或者生成静态库或者静态库。

ar: 归档工具,可以将多个文件组合成一个大文件,并且可以读取原始文件的内容

strip: 去除文件中的符号

nm: 可以i显示目标文件中的符号

objcopy: 转换二进制代码的工具,可以将二进制代码转换成各种格式

objdump: 显示目标文件的反汇编工具

readelf: 显示ELF文件的各种信息

strings: 显示文件中可打印字符

ranlib: 产生归档文件的索引,并将其保存到归档文件中。

addr2line: 可以将一个可执行程序的地址映射到源文件的对应的行

gprof: 显示程序调用段的各种信息。

05. GCC工具

5.1 gcc用法参考

[root@deng test]# gcc --help
用法:gcc [选项] 文件...
选项:
  -pass-exit-codes         在某一阶段退出时返回最高的错误码
  --help                   显示此帮助说明
  --target-help            显示目标机器特定的命令行选项
  (使用‘-v --help’显示子进程的命令行参数)
  -dumpspecs               显示所有内建 spec 字符串
  -dumpversion             显示编译器的版本号
  -dumpmachine             显示编译器的目标处理器
  -print-search-dirs       显示编译器的搜索路径
  -print-libgcc-file-name  显示编译器伴随库的名称
  -print-file-name=<>    显示 <> 的完整路径
  -print-prog-name=<程序>  显示编译器组件 <程序> 的完整路径
  -print-multi-directory   显示不同版本 libgcc 的根目录
  -print-multi-lib         显示命令行选项和多个版本库搜索路径间的映射
  -print-multi-os-directory 显示操作系统库的相对路径
  -Wa,<选项>               将逗号分隔的 <选项> 传递给汇编器
  -Wp,<选项>               将逗号分隔的 <选项> 传递给预处理器
  -Wl,<选项>               将逗号分隔的 <选项> 传递给链接器
  -Xassembler <参数><参数> 传递给汇编器
  -Xpreprocessor <参数><参数> 传递给预处理器
  -Xlinker <参数><参数> 传递给链接器
  -combine                 将多个源文件一次性传递给汇编器
  -save-temps              不删除中间文件
  -pipe                    使用管道代替临时文件
  -time                    为每个子进程计时
  -specs=<文件><文件> 的内容覆盖内建的 specs 文件
  -std=<标准>              指定输入源文件遵循的标准
  --sysroot=<目录><目录> 作为头文件和库文件的根目录
  -B <目录><目录> 添加到编译器的搜索路径中
  -b <机器>                为 gcc 指定目标机器(如果有安装)
  -V <版本>                运行指定版本的 gcc(如果有安装)
  -v                       显示编译器调用的程序
  -###                     与 -v 类似,但选项被引号括住,并且不执行命令
  -E                       仅作预处理,不进行编译、汇编和链接
  -S                       编译到汇编语言,不进行汇编和链接
  -c                       编译、汇编到目标代码,不进行链接
  -o <文件>                输出到 <文件>
  -x <语言>                指定其后输入文件的语言
                           允许的语言包括:c c++ assembler none
                           ‘none’意味着恢复默认行为,即根据文件的扩展名猜测
                           源文件的语言
                           
                           
  -w 			不显示警告信息
  -W 			指定需要显示的警告信息
  -Wall 		表示显示所有的警告信息
  -Werr 		将警告信息当成错误、并终止编译
  -DMACRO		定义宏MACRO为字符串1
  -DMACRO=DEF	定义MACRO宏为字符串DEF
  -UMACRO		取消对MACRO宏的定义
  -ggdb			生成可被gdb使用的标准调试信息
  -mXXX			针对XXX CPU进行优化,例如XXX可以是486 586等
  -O0			不进行代码优化
  -O或者-O1	   进行一般的代码优化,减少执行代码大小和执行的时间
  -O2			比-O1进行更多的优化,减少执行代码大小和执行的时间
  -O3			比-O2更进一步优化
  -MM			输出源文件的依赖关系
  -ansi 		编译器将所有的gnu的编译器特性都关掉,可以让程序和Ansi标准兼容
  -include file 编译之前将file包含进去,相当于在所有编译的源文件最前面加入include <file>语句
  -imacros file 与-include file一样,不过这个文件在具体编译的时候只有里面定义的宏才起作用,
  				所以只用来在file文件中定义宏
  -nostdinc 	在搜寻include的文件路径中去掉标准的C语言头文件搜索路径,例如stdin.h文件
  				就是放在标准头文件搜索路径下。
  -C 			通-E参数配合使用,让预处理后的结果保留注释,一遍程序更易读。
  -nostartfiles 在链接的时候不把系统相关的启动代码链接起来
  -nostdlib 	在链接的时候不把标准库链接进来
  
以 -g、-f、-m、-O、-W 或 --param 开头的选项将由 gcc 自动传递给其调用的
 不同子进程。若要向这些进程传递其他选项,必须使用 -W<字母> 选项。

5.2 参考示例

[root@deng test]# ls
a.out  main.c  myputs.c  myputs.h  test.c  test.h
[root@deng test]# gcc -pipe -g -Wall -I. -c test.c -o test.o
[root@deng test]# 

#解释
-g:     表示含有调试信息
-Wall:    表示输出所有的警告
-I.     表示包含当前目录作为头文件搜索路径,这个选项用于增加搜索头文件的路径
-pipe:      表示使用管道替换临时文件
-o:      指定输出地目标文件的名称

06. 附录

6.1【Linux】GCC程序开发工具(上)
6.2 【Linux】GCC程序开发工具(中)
6.3 【Linux】GCC程序开发工具(下)