vlambda博客
学习文章列表

【Linux】GCC程序开发工具(上)

00. 目录

00. 目录01. GNU工具概述02. 常用文本文件03.  常用二进制文件04. Binutils工具集05. GCC工具06. 附录


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:  产生归档文件的索引,并将其保存到归档文件中。

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. 附录