gcc系列工具 介绍
编译器相关知识学习
GNU GCC简介
GNU GCC是一套面向嵌入式领域的交叉编译工具,支持多种编程语言、多种优化选项并且能够支持分步编译、支持多种反汇编方式、支持多种调试信息格式,目前支持X86、ARM7、StrongARM、PPC4XX、MPC8XX、MIPS R3000等多种CPU。
根据不同的目标环境,gcc会有形如:arm-linux-gcc,mips-linux-gcc等对应的工具,除了名字和编译运行的平台不同,都适用于本教程。
GNU GCC的基本功能包括:
- 输出预处理后的C/C++源程序(展开头文件和替换宏)
- 输出C/C++源程序的汇编代码
- 输出二进制目标文件
- 生成静态库
- 生成可执行程序
- 转换文件格式
GCC编译程序的基本过程:
gcc根据输入文件的后缀来确定文件的类型,然后根据用户的编译选项(包括优化选项、调试信息选项等)将其编译成相应的汇编临时文件(后缀为.s);
as将该汇编文件编译成目标文件(后缀为.o); ld 根据用户的链接选项(包括指定链接命令文件等)将目标文件和各种库链接起来生成可执行文件。
GCC 组成:
- gcc:C/C++交叉编译器
gcc是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件的功能。
编译时,它首先调用预处理程序(cpp)对输入的源程序进行处理,然后调用 cc1 将预处理后的程序编译成汇编代码,最后由as将汇编代码编译成目标代码。
gcc具有丰富的命令选项,可以控制编译的各个阶段,满足用户的各种编译需求。
- as:汇编器
as将汇编语言程序转换为ELF (Executable and Linking Format,执行时链接文件格式)格式的可重定位目标代码,这些目标代码同其它目标模块或函数库易于定位和链接。
as产生一个交叉参考表和一个标准的符号表,产生的代码和数据能够放在多个区 (Section)中。
- ld:连接器
ld根据链接定位文件Linkcmds中的代码区、数据区、BSS区和栈区等定位信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序。
该目标程序是ELF格式,并且可以包含调试信息。
ld会产生一个内存映象文件Map.txt,该文件显示所有目标模块、区和符号的绝对定位地址。它也产生交叉参考列表,显示参考每个全局符号的目标模块。
ld支持将多个目标模块链接成一个单一的、绝对定位的目标程序,也能够依此对目标模块进行链接,这个特性称为增量链接(Incremental Linking)。
假如输入文件是一个函数库,ld会自动从函数库装载被其它目标模块参考的函数模块。ld与其它链接程序相比,能提供更有帮助的诊断信息。许多链接器遇到第一个错误即放弃链接,而ld只要有可能都继续执行,帮助用户识别其它错误,有时甚至能获得输出代码。
- ar:库管理器
ar将多个可重定位的目标模块归档为一个函数库文件。采用函数库文件,应用程序能够从该文件中自动装载要参考的函数模块,同时将应用程序中频繁调用的函数放入函数库文件中,易于应用程序的开发管理。ar支持ELF格式的函数库文件.
- MAKE:
实际上make不属于gcc套件,但是在UNIX环境下,经常使用make(指定Makefile)来管理编译工程。
Make是用于自动编译、链接程序的实用工具。使用make后就不需要手工的编译每个程序文件。要使用make,首先要编写makefile。
Makefile描述程序文件之间的依赖关系,并提供更新文件的命令。在一个程序中,可执行文件依赖于目标文件,而目标文件依赖于源文件。如果makefile文件存在,每次修改完源程序后,用户通常所需要做的事情就是在命令行敲入“make”,然后所有的事情都由make来完成。
- 其他实用程序
目标文件格式转换工具objcopy支持的文件格式有H-record、S-record、ABS、BIN、COFF、ELF。例如,它能够将ELF格式文件转换为其它格式的文件,如intel H-record格式、Motorola S-record等。nm程序用于显示文件中的符号信息。
C/C++交叉编译器gcc
gcc是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件。
编译时它首先调用预处理程序(cpp)对输入的源程序进行处理;然后调用cc1将预处理后的程序编译成汇编代码;最后由as将汇编代码编译成目标代码。
1.命令格式:
gcc [options] file…
在命令gcc后面跟一个或多个选项,选项间用空格隔开,然后跟一个或多个目标文件。
例如,将test.c 编译成目标文件test.o 并且生成调试信息:
gcc –g –c –o test.o test.c
2.命令选项列表
输出控制选项:
-c 将输入的源文件编译成目标文件
-S 将C/C++文件生成汇编文件
-o file 将输出内容存于文件file
-pipe 在编译的不同阶段之间采用管道通讯方式
-v 打印出编译过程中执行的命令
-x language 说明文件的输入类型为language
C语言选项:
-ansi 支持所有ANSI C程序
警告选项:
-w 关闭所有警告
-Wall 打开所有警告
-Wimplicit 如果有隐含申明,显示警告信息
-Wno-implicit 不显示对隐含申明的警告
调试选项:
-g 在文件中产生调试信息(调试信息的文件格式有stabs、COFF、XCOFF、DWARF)
优化选项:
-O0 不优化
-O1 一级优化
-O2 二级优化
-O3 三级优化
预处理选项:
-E 运行C的预处理器
-C 在运用-E进行预处理时不去掉注释
-D macro 定义宏macro为1
-D macro=defn 定义宏macro为defn
汇编选项:
-Wa,option 将选项option传递 给汇编器
搜索路径选项:
-I dir 设置搜索路径为dir
-I- 指定只对 #include "file",有效的头文件搜索目录
- 源文件类型的识别
gcc能够自动根据文件名后缀识别文件类型,文件名后缀和文件类型的对应关系如下:
*.c ——C源文件
*.i ——经过预处理后的C源文件
*.h ——C头文件
*.ii ——经过预处理后的C++源文件
*.cc ——C++源文件
*.cxx ——C++源文件
*.cpp ——C++源文件
*.C ——C++源文件
*.s ——不需要预处理的汇编文件
*.S ——需要预处理的汇编文件
此外,用户可通过-x language说明文件的输入类型,此时可以不用以上的后缀规则。其中的language可为:
c ——C源文件
c++ ——C++源文件
c-header ——C头文件
cpp-output ——经过预处理后的C源文件
c++-cpp-output ——经过预处理后的C++源文件
assembler ——不需要预处理的汇编文件
assembler-with-cpp ——需要预处理的汇编文件
例如,编译一个不需要预处理的C程序:
gcc –c –g –x cpp-output test.c
gcc编译库:
- gcc编译动态库.so:
gcc -fPIC -shared fun.c -o libxx.so
- 编译静态库.a:
ar rcs libxx.a fun.c
objcopy
objcopy被用来复制一个目标文件的内容到另一个文件中,可用于不同源文件的之间的格式转换
示例:objcopy –o binary –S elf_file bin_file
常用的选项:
input-file , outflie
输入和输出文件,如果没有outfile,则输出文件名为输入文件名
-l bfdname或—input-target=bfdname
用来指明源文件的格式,bfdname是BFD库中描述的标准格式名,如果没指明,则objcopy自己分析
-O bfdname 输出的格式
-F bfdname 同时指明源文件,目的文件的格式
-R sectionname 从输出文件中删除掉所有名为sectionname的段
-S 不从源文件中复制重定位信息和符号信息到目标文件中
-g 不从源文件中复制调试符号到目标文件中
参考链接:http://www.360doc.com/content/14/0509/09/17268421_376009916.shtml
gcc系列工具 介绍的更多相关文章
- gcc 交叉工具链中工具使用(arm-linux-xxx)
在Ubuntu系统中使用 gcc 系列工具是在PC机上使用 arm-linux-gcc 编译的目标 是在 arm CPU上使用 一.安装交叉编译工具链 1. 编译工具怎么获取 1)从官网 http:/ ...
- 系列二VS项目软件配置工具介绍
原文:系列二VS项目软件配置工具介绍 Svn和VisualSvn介绍 在使用TortoiseSvn(SVN客户端)+ AnkhSvn(VS2008插件) +VisualSvn Server(版本控制服 ...
- 自定义View系列教程01--常用工具介绍
站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定 ...
- 使用autotools系列工具自动部署源代码编译安装
在Linux系统下开发一个较大的项目,完全手动建立Makefile是一件费力而又容易出错的工作.autotools系列工具只需用户输入简单的目标文件.依赖文件.文件目录等就可以比较轻松地生成Makef ...
- 使用python制作ArcGIS插件(1)工具介绍
使用python制作ArcGIS插件(1)工具介绍 by 李远祥 ArcGIS从10.0开始支持addin(ArcGIS软件中又叫作加载项)的方式进行插件制作.相对于以往9.x系列,addin的无论是 ...
- Caffe学习系列——工具篇:神经网络模型结构可视化
Caffe学习系列——工具篇:神经网络模型结构可视化 在Caffe中,目前有两种可视化prototxt格式网络结构的方法: 使用Netscope在线可视化 使用Caffe提供的draw_net.py ...
- uml建模工具介绍
应用最广的由两种种1. Rational Rose,它是ibm的 .2.Microsoft的 Microsoft Office Visio® 2003 3.Enterprise Architect.还 ...
- MySQL Flashback 工具介绍
MySQL Flashback 工具介绍 DML Flashback 独立工具,通过伪装成slave拉取binlog来进行处理 MyFlash 「大众点点评」 binlog2sql 「大众点评(上海) ...
- 学习游戏服务器开发必看,C++游戏服务器开发常用工具介绍
C++游戏服务器开发常用工具介绍 在软件开发过程中需要使用的工具类型实属众多,从需求建模到软件测试,从代码编译到工程管理,这些工具都对项目有着不可替代的作用.庄子有云,"吾生也有涯,而知也无 ...
- openresty开发系列12--lua介绍及常用数据类型简介
openresty开发系列12--lua介绍及常用数据类型简介 lua介绍 1993 年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de ...
随机推荐
- Excel根据名称批量导入图片
一. 效果 二.方法一 在Excel中如果内容 ="<table><img src=""D:\文档\常用文件\图片导入测试\"&A2& ...
- Flink Batch Hash Aggregate
数据类型要求 BatchPhysicalHashAggRule match 条件会判断 isAggBufferFixedLength(agg) 为什么要求 aggCall 的类型是 Fixed Len ...
- AIRIOT答疑第2期|如何使用物联网平台的数据采集与控制引擎?
任性用! 作为AIRIOT物联网低代码平台的五大核心能力引擎之一,数据采集与控制引擎具备极强的系统集成能力,提供丰富的接口,具备海量工业设备驱动库,分布式采集,稳定性高,实现快速的设备接入.报警. ...
- lvs之DR模式的实操演练
理论 我是内部服务,代替我访问外部网络,这是正向代理:代替外部网络访问我,这是反向代理 槽位 sh根据源地址.调度到某个节点,dh,根据目标地址,调度到某个节点, 实战演练 默认策略以及修改策略 查看 ...
- winform 绘图控件 chart 实时曲线图
官方教程:http:////files.cnblogs.com/files/HelloQLQ/Winform图表.rar 更多参考:https://blog.csdn.net/boxuming/art ...
- Android OpenMAX(一)漫谈
在开始正式的学习前,我们先来聊一聊Android音视频开发中的一些问题.感受与想法.(有一点要事先说明,我的问题与答案.想法并不一定正确,请读者带着审慎的思考来阅读,后续的文章也是一样,希望读者边阅读 ...
- 这是一个基于threading可停止线程的有限容量有限并行度的python任务管理器
这是一个可停止线程的有限容量有限并行度的任务管理器 基于:GitHub - AlitaIcon/StopableThreadJob: 可停止线程任务管理器 Quick Start 基础调用与效果 im ...
- 《iOS面试之道》-“串行队列的代码实战” 勘误
一.原书第一版154页开始讲解串行队列.并发队列.以及在Dispatch_Async.Dispatch_Sync下面的作用 最后一段代码: if(_q == NULL) { _q = dispatch ...
- 强!推荐一款开源接口自动化测试平台:AutoMeter-API !
在当今软件开发的快速迭代中,接口自动化测试已成为确保代码质量和服务稳定性的关键步骤. 随着微服务架构和分布式系统的广泛应用,对接口自动化测试平台的需求也日益增长. 今天,我将为大家推荐一款强大的开源接 ...
- 表格补充 表单补充 BFC
表格标签补充" A,数据行分组 <thead></thead>表头 <tbody></tbody>表体 <tfoot></t ...