gcc系列工具 介绍

摘要:
根据不同的目标环境,gcc将是可见的,例如arm linux gcc、mips linux gcc和其他相应的工具。除了用于编译和运行的不同名称和平台外,它们都适用于本教程。Gcc有丰富的命令选项,可以控制编译的各个阶段,以满足用户的各种编译需求。Ar支持ELF格式的函数库文件MAKE:事实上,MAKE不属于gcc套件,但在UNIX环境中,MAKE通常用于管理编译项目。命令gcc后跟一个或多个选项,用空格分隔,后跟一个或者多个对象文件。

编译器相关知识学习

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系列工具 介绍》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇docker help一个下拉联动控件的实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

IntelliJ IDEA 编译程序出现 非法字符 的 解决方法

IntelliJ IDEA 编译程序出现 非法字符 的 解决方法 idea报Error:(1, 21) java: 非法字符: 'ufffd' 的解决办法 韩风666 2020-04-30 21:53:56 1043 收藏 分类专栏: javaee报错 版权 方法1,直接去掉汉字或包名 方法2, 注意:经常不灵 点击该类,选择 utf-16转码,再u...

模块与包的导入

1.模块什么是模块: #常见的场景:一个模块就是一个包含了python定义和声明的文件(文件名就是模块名字加上.py的后缀),模块可以被导入使用。 #但其实import加载的模块分为四个通用类别:  使用python编写的.py文件 已被编译为共享库或DLL的C或C++扩展 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该...

Arch/GentooLinux开发环境构建与常用软件一览

编辑器 Emacs Arch Linux yay -S clang emacs Gentoo Linux sudo emerge --ask clang emacs visual-studio-code Gentoo Linuxsudo emerge --ask app-editors/visual-studio-code sublim...

迅为龙芯2K1000开发板系统编译编译Linux内核

龙芯目前主推的内核版本有 linux‐2.6.32 和 linux‐3.10 两个版本,其中 linux‐2.6.32 主要用于龙芯1号 CPU、龙芯2H和龙芯3A , linux‐3.10 主要用于龙芯 3A2000 和 2K 以上的 CPU 版本。LS2K1000 使用的内核版本为 linux‐3.10。交叉编译器版本为 gcc‐4.9.3‐64‐gn...

文件解析库doctotext安装和使用

安装doctotext 1 安装GCC到4.6以上 tar jxf gcc-4.7.0.tar.bz2 cd gcc-4.7.0 编译 ./contrib/download_prerequisites mkdir build cd build ../configure --disable-checking --disable-multilib --enab...

Visual C++ 6.0编程环境的使用

1.1 编制并运行程序的四部曲 (1)编辑(把程序代码输入,交给计算机)。 (2)编译(成目标程序文件.obj)。编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行...