您的位置:首页 > 其它

几个编译过程的概念

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: