编译器相关知识学习

GNU GCC简介

GNU GCC是一套面向嵌入式领域的交叉编译工具,支持多种编程语言、多种优化选项并且能够支持分步编译、支持多种反汇编方式、支持多种调试信息格式,目前支持X86、ARM7、StrongARM、PPC4XX、MPC8XX、MIPS R3000等多种CPU。

根据不同的目标环境,gcc会有形如:arm-linux-gccmips-linux-gcc等对应的工具,除了名字和编译运行的平台不同,都适用于本教程。

GNU GCC的基本功能包括:

  • 输出预处理后的C/C++源程序(展开头文件和替换宏)
  • 输出C/C++源程序的汇编代码
  • 输出二进制目标文件
  • 生成静态库
  • 生成可执行程序
  • 转换文件格式

GCC编译程序的基本过程:

gcc根据输入文件的后缀来确定文件的类型,然后根据用户的编译选项(包括优化选项、调试信息选项等)将其编译成相应的汇编临时文件(后缀为.s);

as将该汇编文件编译成目标文件(后缀为.o); ld 根据用户的链接选项(包括指定链接命令文件等)将目标文件和各种库链接起来生成可执行文件。

GCC 组成:

  1. gcc:C/C++交叉编译器

gcc是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件的功能。

编译时,它首先调用预处理程序(cpp)对输入的源程序进行处理,然后调用 cc1 将预处理后的程序编译成汇编代码,最后由as将汇编代码编译成目标代码。

gcc具有丰富的命令选项,可以控制编译的各个阶段,满足用户的各种编译需求。

  1. as:汇编器

as将汇编语言程序转换为ELF (Executable and Linking Format,执行时链接文件格式)格式的可重定位目标代码,这些目标代码同其它目标模块或函数库易于定位和链接。

as产生一个交叉参考表和一个标准的符号表,产生的代码和数据能够放在多个区 (Section)中。

  1. ld:连接器

ld根据链接定位文件Linkcmds中的代码区、数据区、BSS区和栈区等定位信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序。

该目标程序是ELF格式,并且可以包含调试信息。

ld会产生一个内存映象文件Map.txt,该文件显示所有目标模块、区和符号的绝对定位地址。它也产生交叉参考列表,显示参考每个全局符号的目标模块。

ld支持将多个目标模块链接成一个单一的、绝对定位的目标程序,也能够依此对目标模块进行链接,这个特性称为增量链接(Incremental Linking)。

假如输入文件是一个函数库,ld会自动从函数库装载被其它目标模块参考的函数模块。ld与其它链接程序相比,能提供更有帮助的诊断信息。许多链接器遇到第一个错误即放弃链接,而ld只要有可能都继续执行,帮助用户识别其它错误,有时甚至能获得输出代码。

  1. ar:库管理器

ar将多个可重定位的目标模块归档为一个函数库文件。采用函数库文件,应用程序能够从该文件中自动装载要参考的函数模块,同时将应用程序中频繁调用的函数放入函数库文件中,易于应用程序的开发管理。ar支持ELF格式的函数库文件.

  1. MAKE:

实际上make不属于gcc套件,但是在UNIX环境下,经常使用make(指定Makefile)来管理编译工程。

Make是用于自动编译、链接程序的实用工具。使用make后就不需要手工的编译每个程序文件。要使用make,首先要编写makefile。

Makefile描述程序文件之间的依赖关系,并提供更新文件的命令。在一个程序中,可执行文件依赖于目标文件,而目标文件依赖于源文件。如果makefile文件存在,每次修改完源程序后,用户通常所需要做的事情就是在命令行敲入“make”,然后所有的事情都由make来完成。

  1. 其他实用程序

目标文件格式转换工具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",有效的头文件搜索目录
  1. 源文件类型的识别

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系列工具 介绍的更多相关文章

  1. gcc 交叉工具链中工具使用(arm-linux-xxx)

    在Ubuntu系统中使用 gcc 系列工具是在PC机上使用 arm-linux-gcc 编译的目标 是在 arm CPU上使用 一.安装交叉编译工具链 1. 编译工具怎么获取 1)从官网 http:/ ...

  2. 系列二VS项目软件配置工具介绍

    原文:系列二VS项目软件配置工具介绍 Svn和VisualSvn介绍 在使用TortoiseSvn(SVN客户端)+ AnkhSvn(VS2008插件) +VisualSvn Server(版本控制服 ...

  3. 自定义View系列教程01--常用工具介绍

    站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定 ...

  4. 使用autotools系列工具自动部署源代码编译安装

    在Linux系统下开发一个较大的项目,完全手动建立Makefile是一件费力而又容易出错的工作.autotools系列工具只需用户输入简单的目标文件.依赖文件.文件目录等就可以比较轻松地生成Makef ...

  5. 使用python制作ArcGIS插件(1)工具介绍

    使用python制作ArcGIS插件(1)工具介绍 by 李远祥 ArcGIS从10.0开始支持addin(ArcGIS软件中又叫作加载项)的方式进行插件制作.相对于以往9.x系列,addin的无论是 ...

  6. Caffe学习系列——工具篇:神经网络模型结构可视化

    Caffe学习系列——工具篇:神经网络模型结构可视化 在Caffe中,目前有两种可视化prototxt格式网络结构的方法: 使用Netscope在线可视化 使用Caffe提供的draw_net.py ...

  7. uml建模工具介绍

    应用最广的由两种种1. Rational Rose,它是ibm的 .2.Microsoft的 Microsoft Office Visio® 2003 3.Enterprise Architect.还 ...

  8. MySQL Flashback 工具介绍

    MySQL Flashback 工具介绍 DML Flashback 独立工具,通过伪装成slave拉取binlog来进行处理 MyFlash 「大众点点评」 binlog2sql 「大众点评(上海) ...

  9. 学习游戏服务器开发必看,C++游戏服务器开发常用工具介绍

    C++游戏服务器开发常用工具介绍 在软件开发过程中需要使用的工具类型实属众多,从需求建模到软件测试,从代码编译到工程管理,这些工具都对项目有着不可替代的作用.庄子有云,"吾生也有涯,而知也无 ...

  10. openresty开发系列12--lua介绍及常用数据类型简介

    openresty开发系列12--lua介绍及常用数据类型简介 lua介绍  1993 年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de ...

随机推荐

  1. csapp-attacklab(完美解决版)

    注意:必须阅读Writeup,否则根本看不懂这个lab要怎么做 实验前准备 1.在终端中输入./ctarget和./rtarget结果报错 百度后得知自学的同学需要在执行文件时加上-q参数,不发送结果 ...

  2. vue3组件封装

    1.父组件调用子组件属性和方法 父组件中template写法: <role-modal ref="myRoleModal" @OK="roleModalOK&quo ...

  3. vue3创建工程

    创建 Vue3 项目的步骤如下: 安装 Node.js Vue3 需要依赖 Node.js 环境,因此需要先安装 Node.js.可以从官网下载 Node.js 的安装包并安装,也可以使用包管理器安装 ...

  4. 4G EPS 中的 Bearer

    目录 文章目录 目录 前文列表 承载的内涵 EPS Bearer QoS QoS 的关键参数 APR GBR.MBR AMBR UE 是如何选择 EPS Bearer 的? E-RAB Radio B ...

  5. avue组件自定义按钮/标题/内容/搜索栏

    话不多说 笔记直接分享!! 一.自定义crud搜索栏组件 <template slot-scope="scope" slot="provinceCodeSearch ...

  6. 智能制造 | AIRIOT智慧工厂管理解决方案

      工厂生产运转中,设备数量多,环境复杂.企业往往需要承担很高的维修.保养.备件和人力成本.传统的工厂改革遇到了诸多前所未有的挑战:   1.管理系统较多,数据隔离,系统集成困难重重: 2.大量老旧设 ...

  7. CSS旋转正方体

    CSS实现一个旋转的正方体,鼠标放上去会自动解体.比较普通的实现,留个记录.(代码里的注释方式写错了) <!doctype html> <html lang="en&quo ...

  8. 开源项目 cloud-platform 的本地部署

    F7 单步调试,进入函数内部 F8 单步调试,不进入函数内部 F9 继续执行,进入下一个断点或执行完程序 Shift+F7 选择要进入的函数 Shift+F8 跳出函数 Ctrl+F8 设置/取消当前 ...

  9. .NET常用库-Ocelot

    一 介绍 1.简介 Ocelot是一个.NET API网关. Ocelot仅适用于.NET Core,目前是为netstandard2.0构建的. Ocelot是一组按特定顺序排列的中间件. Ocel ...

  10. Visual Studio 智能代码插件:CodeGeeX

    前言 在软件开发领域,高效的编程助手一直是提升开发者效率和质量的关键.随着人工智能技术的不断发展,智能编程助手逐渐成为开发者们不可或缺的工具.其中,CodeGeeX作为一款专为Visual Studi ...