gcc编译工具集中各软件的用途以及ELF文件格式

一、什么是GCC

gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C++、java、Pascal等语言。gcc支持多种硬件平台。

二、 GCC的组成

如图:
在这里插入图片描述

三、 GCC的使用

GCC编译的四个阶段为:预处理(也称预编译,Preprocessing)、编译
(Compilation)、汇编 (Assembly)和连接(Linking)

1. 创建test.c文件,输入代码

//test.c
#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
return 0;
}

在这里插入图片描述

2. 预处理

预处理会处理源代码中的预处理指令,如宏定义、条件编译等。它会根据这些指令对源代码进行修改和替换,生成一个经过预处理的源代码文件

gcc -E test.c -o test.i 或 gcc -E

查看预处理后的test.i
在这里插入图片描述
此时还是可读文件

3. 编译为汇编代码

在编译阶段,编译器会将预处理后的源代码翻译成汇编语言。它会进行词法分析、语法分析和语义分析,生成中间代码或汇编代码。

gcc -S test.i -o test.s

在这里插入图片描述

4. 汇编

在汇编阶段,汇编器会将汇编代码转化为机器代码,即目标文件。它会将汇编指令翻译成机器指令,并生成与目标平台相关的二进制文件(ELF文件)。

gcc -c test.s -o test.o

在这里插入图片描述
打开文件可以看到此时的test.o文件已经是二进制机器指令了

5. 连接

① 普通用法

在连接阶段,连接器会将多个目标文件和库文件合并成一个可执行文件或共享库。它会解析符号引用和符号定义,将它们进行关联,生成最终的可执行文件或共享库。

gcc test.o -o test

也可以通过

gcc test.c -o test

一步到位

通过./test查看编译好的可执行文件:

在这里插入图片描述

② 库的链接

链接阶段系统会首先从 gcc 命 令的
参数-L指定的路径寻找再 从环 境变量LIBRARY_PATH 指定的路径寻址;再从默认路径/lib、/usr/lib、 /usr/local/lib 寻找 ,然后优先链接动态库
通过

ldd test

可查看test链接了哪些库
在这里插入图片描述
可以看到链接的库主要是 Linux 的 glibc
动态库

GCC动态库与静态库的使用中讲解了如何创建动态库

我们尝试使用下创建好的liboxx.so库

Ⅰ 更改test.c代码

选择链接上一步链接中建立好的liboxx.so动态库
在这里插入图片描述

Ⅱ 链接动态库并运行
gcc -o test test.c liboxx.so

在这里插入图片描述
通过ldd指令查看链接的库
在这里插入图片描述
可以看到liboxx.so已经链接了

6. 分析ELF文件

定义:ELF(Executable and Linkable Format)是一种可执行文件和可链接文件的标准文件格式。它是一种用于表示二进制可执行文件、共享库、目标文件等的文件格式,广泛应用于类Unix系统中。
ELF文件格式定义了如何组织和存储可执行代码、数据、符号表、调试信息等在内存中的布局和结构。ELF文件格式具有以下特点:
可扩展性:ELF文件格式支持多种体系结构,如x86、ARM、MIPS等,可以适应不同的硬件平台。
1.独立性:ELF文件格式与特定的操作系统无关,因此可以在不同的操作系统上运行。
2.可重定位性:ELF文件格式支持对代码和数据的重定位,允许将多个目标文件链接成一个可执行文件或共享库。
3.可扩展的头部:ELF文件格式的头部包含了关于文件的元数据信息,如入口点地址、段表、符号表等。
4.调试信息支持:ELF文件格式可以包含调试信息,用于程序调试和符号表查找等。
ELF文件格式在类Unix系统中被广泛使用,如Linux、macOS等。它提供了一种标准的文件格式,使得不同的编译器、链接器和调试器能够共同使用和处理可执行文件、共享库和目标文件。

ELF 文件格式如下图所示,位于 ELF Header 和 Section Header Table 之间的都
是段(Section)。一个典型的 ELF 文件包含下面几个段:
.text:已编译程序的指令代码段。
.rodata:ro 代表 read only,即只读数据(譬如常数 const)。
.data:已初始化的 C 程序全局变量和静态局部变量。
.bss:未初始化的 C 程序全局变量和静态局部变量。
.debug:调试符号表,调试器用此段的信息帮助调试。
在这里插入图片描述

可以使用 readelf -S 查看其各个 section
在这里插入图片描述
也可以反汇编ELF文件查看他的指令和数据
使用:

objdump -D test

在这里插入图片描述
这是反汇编后的test的机器指令
如果需要反汇编为一个文件查看可以:

objdump -D test > test.txt
//表示将test反汇编为test.txt

也可以通过

objdump -S test

将文件反汇编并混合C语言代码显示
前提:

gcc -o test -g test.c -loxx  

-g选项表示在编译过程中生成调试信息,这样可以在调试程序时使用调试器进行源代码级别的调试

在这里插入图片描述
参考文献:
1.Linux GCC 常用命令
2.GCC编译器背后的故事

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值