几个编译过程的概念
2012-05-14 22:47
246 查看
发现自己对待知识太不严谨了。而且,我发现,我和大部分人一样都是思维懒惰的人。对待难题,总是喜欢找捷径找捷径。其实,这也是逃避困难的一种。
旺盛的求知欲,真的很维持。也许情商才是决定一个人智慧的标准,对于普通人来说,智商的差别实在太小了。而成功与非成功人士之间情商的差别确实很好。
每天进步一小步。让雨汇成浩瀚的大海。
gcc所支持的后缀名解释
.c:C语言原始程序 .s/.S:汇编语言原始程序
.cc/.cxx/.C:C++ 原始程序 .h:预处理文件(头文件)
.m:Objective-C原始程序 .o:目标文件
.i :已经过预处理的c原始程序 .a/.so:编译后的库文件
.ii 已经过预处理的c++原始程序
gcc编译流程解析
1、预处理
2、编译
3、汇编
4、链接
汇编阶段是在编译阶段生成的.s文件转成目标文件,读者在此可使用选项-c就可以看到汇编代码已经转化为.o的二进制目标代码了
在成功编译之后,就进入了链接阶段,在这里涉及到一个重要的概念:函数库。
系统把函数实现都被做成libc,so.6的库文件中去了,这样子就能实现函数了,而这也就是链接的作用了
函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库函数的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为.a。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为.so,如前面所述的libc.so.6就是动态库。
Gcc编译选项分析
1)总体选项
-c 只是编译不链接,生成目标文件.o
-s 只是编译不汇编,生成汇编代码
-E 只是进行预编译,不做其他处理
-g 在可执行程序中包含标准调试信息
-o file 把输出文件输出到file里
-v 打印出编译器内部编译各过程的命令行信息和编译器的版本
-I dir 在头文件的搜索路径列表中添加dir目录
-L dir 在库文件的搜索路径列表中添加dir目录
-static 链接静态库
-library 连接名为library的库文件
cpp GNU预编译器,主要用于扩展用户源程序的头文件和宏定义。cpp是GNU C编译器的预处理器。cpp是一个宏指令处理器,GNU C编译器在编译前自动使用cpp对用户程序进行转换。cpp之所以被称为宏指令处理器是因为它允许用户定义宏指令
gcc 符合ISO标准的C编译器
g++ 基本符合ISO标准的C++编译器。
gcj 是GCC的java前端,可以生成执行速度更快的二进制本地执行码,而不是java binary code 。gcj为把java 程序编译成机器代码提供了试验性的支持。要做到这一点,用户还需要安装相关的gava运行时库
gnat 是GCC的GNU ADA 95 前端。该软件包包括开发工具、文档以及ADA95编译器。目前很少有程序是用ADA写的。
binutils是一组二进制工具程序集,它包括addr2line、ar、as、gprof、ld、nm、objcopy、objdump、ranlib、size、strings、strip等工具,是辅助GCC的主要软件
as GNU编译器
ld GNU链接器,主要用于确定相对地址,把多个object 文件、起始代码段、库等链接起来,并最终形成一个可执行文件。
addr2line 把执行程序中的地址映射到源文件中的对应行。
ar 创建归档文件、修改、替换库中的object文件,向库中添加、提取object文件
c++file 解码c++符号名
nm 列出object文件中的符号
objcopy 复制和转换object文件
objdump 用来显示文件的信息
ranlib 根据归档文件中内容建立索引
readelf 显示elf格式执行文件中的各种信息
size 显示object 文件和执行执行文件各节和总的大小
strings 显示文件中可以打印的字符
strip 去掉执行文件中多余的信息,可减少执行文件的大小
gprof 用来像是调用图表档案数据
制作交叉编译器的步骤是:
1、编译binutils
2、编译一个最简单得gcc
3、编译libc
4、再次编译gcc,生成功能完整的gcc
旺盛的求知欲,真的很维持。也许情商才是决定一个人智慧的标准,对于普通人来说,智商的差别实在太小了。而成功与非成功人士之间情商的差别确实很好。
每天进步一小步。让雨汇成浩瀚的大海。
gcc所支持的后缀名解释
.c:C语言原始程序 .s/.S:汇编语言原始程序
.cc/.cxx/.C:C++ 原始程序 .h:预处理文件(头文件)
.m:Objective-C原始程序 .o:目标文件
.i :已经过预处理的c原始程序 .a/.so:编译后的库文件
.ii 已经过预处理的c++原始程序
gcc编译流程解析
1、预处理
2、编译
3、汇编
4、链接
汇编阶段是在编译阶段生成的.s文件转成目标文件,读者在此可使用选项-c就可以看到汇编代码已经转化为.o的二进制目标代码了
在成功编译之后,就进入了链接阶段,在这里涉及到一个重要的概念:函数库。
系统把函数实现都被做成libc,so.6的库文件中去了,这样子就能实现函数了,而这也就是链接的作用了
函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库函数的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为.a。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为.so,如前面所述的libc.so.6就是动态库。
Gcc编译选项分析
1)总体选项
-c 只是编译不链接,生成目标文件.o
-s 只是编译不汇编,生成汇编代码
-E 只是进行预编译,不做其他处理
-g 在可执行程序中包含标准调试信息
-o file 把输出文件输出到file里
-v 打印出编译器内部编译各过程的命令行信息和编译器的版本
-I dir 在头文件的搜索路径列表中添加dir目录
-L dir 在库文件的搜索路径列表中添加dir目录
-static 链接静态库
-library 连接名为library的库文件
cpp GNU预编译器,主要用于扩展用户源程序的头文件和宏定义。cpp是GNU C编译器的预处理器。cpp是一个宏指令处理器,GNU C编译器在编译前自动使用cpp对用户程序进行转换。cpp之所以被称为宏指令处理器是因为它允许用户定义宏指令
gcc 符合ISO标准的C编译器
g++ 基本符合ISO标准的C++编译器。
gcj 是GCC的java前端,可以生成执行速度更快的二进制本地执行码,而不是java binary code 。gcj为把java 程序编译成机器代码提供了试验性的支持。要做到这一点,用户还需要安装相关的gava运行时库
gnat 是GCC的GNU ADA 95 前端。该软件包包括开发工具、文档以及ADA95编译器。目前很少有程序是用ADA写的。
binutils是一组二进制工具程序集,它包括addr2line、ar、as、gprof、ld、nm、objcopy、objdump、ranlib、size、strings、strip等工具,是辅助GCC的主要软件
as GNU编译器
ld GNU链接器,主要用于确定相对地址,把多个object 文件、起始代码段、库等链接起来,并最终形成一个可执行文件。
addr2line 把执行程序中的地址映射到源文件中的对应行。
ar 创建归档文件、修改、替换库中的object文件,向库中添加、提取object文件
c++file 解码c++符号名
nm 列出object文件中的符号
objcopy 复制和转换object文件
objdump 用来显示文件的信息
ranlib 根据归档文件中内容建立索引
readelf 显示elf格式执行文件中的各种信息
size 显示object 文件和执行执行文件各节和总的大小
strings 显示文件中可以打印的字符
strip 去掉执行文件中多余的信息,可减少执行文件的大小
gprof 用来像是调用图表档案数据
制作交叉编译器的步骤是:
1、编译binutils
2、编译一个最简单得gcc
3、编译libc
4、再次编译gcc,生成功能完整的gcc
相关文章推荐
- 编译过程中碰到的几个小问题和解决方法
- Oprofile 编译使用过程中遇到的几个错误
- 【SQL Server】存储过程的设计概念(3)T-SQL的编译和执行过程
- 编译 链接 运行 重定位 这几个概念
- hadoop2.4.1源码在64位系统编译过程中遇到的几个错误及解决方法
- cm13 编译过程中遇到的几个问题及解决方法
- 浅谈CMMI几个过程概念流程管理 (转)
- 通过几个简单的Linux命令,深入理解c语言编译的过程
- AFNetworking和MJRefresh编译过程中遇到的几个小问题
- c语言编译和链接几个项目的具体过程 在linux下
- 浅谈CMMI几个过程概念
- C语言编译过程概念解释
- 链接与加载过程中,几个关键的概念
- 【SQL Server】存储过程的设计概念(3)T-SQL的编译和执行过程
- 链接与加载过程中,几个关键的概念
- easyrec推荐系统学习过程中容易混淆的几个概念
- 在使用android studio过程中,使用gradle编译的时候总会出现一些问题,下面是几个常见问题的解决方法。
- C++一些基本概念总结【面向过程篇】——编译预处理
- 浅谈CMMI几个过程概念流程管理
- C++程序的编译过程及g++与之对应的几个参数