天天看点

gcc编译工具集中各软件的用途,了解EFF文件格式一、gcc编译工具(二)EFF文件格式

目录

(一)、gcc编译工具

(一)GCC

(二)GCC编译过程

(二)EFF文件格式

(三)GCC的常用命令

一、gcc编译工具

(一)GCC

GCC(GNU C Compiler)是编译工具。本文所要介绍的将 C/C++语言编写的程序 转换成为处理器能够执行的二进制代码的过程即由编译器完成。

Binutils: 一组二进制程序处理工具,包括:addr2line、ar、objcopy、objdump、as、ld、 ldd、readelf、 size 等。这 一组工具是开发和调试不可缺少的工具 。

(1)addr2line:用来将程序地址转换成其所对应的程序源文件及所对应的代码行,也可以得到所对应的函数。帮助调试器在调试的过程中定位对应的源代码位置。

(2) as:主要用于将汇编语言编写的源程序装换成二进制形式的目标代码。

(3) ld:主要用于将多个目标文件连接成为可执行程序,同时指定程序在运行时是如何执行的。

(4) ar:从文件中创建、修改和扩展文件,主要用于创建静态库。

(5) ldd:可以用于查看一个可执行程序依赖的共享库。

(6) objcopy:将一种对象文件翻译成另一种格式,譬如将.bin 转换成.elf、或 者将.elf 转换成.bin 等。

(7) objdump:主要的作用是反汇编。既可以反汇编二进制文件,也可以对对象文件进行反汇编。

(8) readelf:显示有关 ELF 文件的信息。

(9) size:列出可执行文件每个部分的尺寸和总尺寸,代码段、数据段、总大小等。
           

C运行库

C 语言标准主要由两部分组成:一部分描述C的语法,另一部分描述C标准库。 C标准库定义了一组标准头文件,每个头文件中包含一些相关的函数、变量、类型声明和宏定义,譬如常见的printf函数便是一个 C标准库函数,其原型定义在stdio头文件中。 C语言标准仅仅定义了C标准库函数原型,并没有提供实现。因此,C语言编译器通常需要一个C运行时库(C Run Time Libray,CRT)的支持。C 运行时库又常简称为 C运行库。与 C语言类似,C++也定义了自己的标准,同时提供相关支持库,称为C++运行时库。

(二)GCC编译过程

编译阶段    编译命令    作用

预处理    gcc -E test.c -o test.i    编译器将源代码中包含头文件编译进来

编译       gcc -S test.i -o test.s    检查代码规范性并翻译成汇编语言

汇编       gcc -c test.s -o test.o    将.s文件转换为目标文件

链接       gcc test.o -o test           将目标文件转换为可执行文件

预处理  gcc -E hello.c -o hello.i

生成hello.i文件

gcc编译工具集中各软件的用途,了解EFF文件格式一、gcc编译工具(二)EFF文件格式

编译gcc -S hello.i -o hello.s

gcc编译工具集中各软件的用途,了解EFF文件格式一、gcc编译工具(二)EFF文件格式

汇编 gcc -c hello.s -o hello.o

gcc编译工具集中各软件的用途,了解EFF文件格式一、gcc编译工具(二)EFF文件格式

链接 gcc hello.o -o hello

gcc编译工具集中各软件的用途,了解EFF文件格式一、gcc编译工具(二)EFF文件格式

(二)EFF文件格式

1.ELF文件

ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。实际上,一个文件中不一定包含全部内容,而且它们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值来决定。1

ELF文件格式如下图,位于ELF Header和Section Header Table 之间的都是段(Section)。一个典型的ELF文件包含下面几个段:

.text:已编译程序的指令代码段。

.rodata:ro 代表 read only,即只读数据(譬如常数 const)。

.data:已初始化的 C 程序全局变量和静态局部变量。

.bss:未初始化的 C 程序全局变量和静态局部变量。

.debug:调试符号表,调试器用此段的信息帮助调试。

gcc编译工具集中各软件的用途,了解EFF文件格式一、gcc编译工具(二)EFF文件格式

一个典型的 ELF 文件包含下面几个段:

.text:已编译程序的指令代码段。

.rodata:ro 代表 read only,即只读数据(譬如常数 const)。

.data:已初始化的 C 程序全局变量和静态局部变量。

.bss:未初始化的 C 程序全局变量和静态局部变量。

.debug:调试符号表,调试器用此段的信息帮助调试。

(三)GCC的常用命令

-c:把源程序编译为目标代码,生成以同名的.o为后缀名的目标文件。

-S:生成一个后缀名为.s的汇编语言文件。

-e对文件进行预处理,预处理的结果送到标准输出(如显示器)中。

-x language:强制编译器用指定的语言编译器来编译某个源程序。

-o:在默认状态下,在当前目录生成一个名为a.out的可执行程序。

-static:强制程序连接静态库。

-L:特别指定所依赖库所在的路径。

 参考:GCC编译工具集和nasm编译器的简要介绍_不#曾&轻听的博客-CSDN博客_nasm编译器

gcc编译工具_Scorpio_L_的博客-CSDN博客