当前位置: 首页 > news >正文

啥是目标文件?目标文件里面有什么?

从c++文件到二进制可执行文件主要经过预处理、编译、汇编和链接的过程,而在这些过程中参与到的文件类型主要有源文件、头文件、目标文件、静态库、动态库和可执行文件。下面表格对这些文件的生成过程和涉及到的步骤名称做个总结。

过程涉及文件
编译source + header -> .s 对源文件和头文件进行预处理和编译,生成汇编代码文件。
汇编.s -> .o 对汇编代码进行汇编生成目标文件,目标文件中存储的已经是机器语言了。
链接(.o -> .a )/(.o -> .so)/ (.o + .a + .so-> executable) 目标文件可以链接成静态库或者动态库,也可以和静态库和动态库链接成为可执行文件

从上面的编译过程我们可以看出目标文件在编译过程中扮演了一个非常重要的角色。我们在编译过程中只需要一条指令就能够直接从源码生成可执行文件,往往忽略了在其中产生重要作用的目标文件。如果想要搞懂编译的原理和程序运行的底层逻辑,目标文件是我们绕不过去的一道坎。下面我们来分析一下目标文件到底是什么样的,以及在编译过程中起到了什么样的作用。

1. 目标文件是什么样的?

目标文件是以段的形式存储的,而不同段的内容都是不同的,例如代码和数据会放在不同的段。目标文件的开头是一个“文件头”,它描述了该文件是否可执行、是静态库还是动态库以及入口地址(如果是可执行文件)、目标硬件、目标操作系统等信息。之所以文件头会存储这么多看似和目标文件无关的信息是因为静态库、动态库和可执行文件都是同一种文件格式,叫做ELF。 这些冗余信息都是用来解析ELF文件的具体类型的。文件头还包括段表,一个描述文件中各个段的数据的数组。段表描述了文件中各个段在文件中的偏移位置及段的属性等。

int printf(const char* format, ...);

int global_init_var = 84; //global variable inited
int global_uninit_var; //global variable uninited

void func1(int i) //function in the object
{
	printf("%d\n", i); //call function out of the object
}

int main(void)
{
	static int static_var = 85;
	static int static_var2;
	int a = 1;
	int b;
	func1(static_var + static_var2 + a + b); //call function in the object
	return a;
}

使用$ gcc -c SimpleSection.cpp命令编译这个文件可以得到SimpleSection.o文件。
使用$ objdump -h SimpleSection.o查看目标文件的结构。需要注意的是,这条命令是对目标文件的文件头中的段表进行解析。
目标文件
解析得到的表的各列的信息为:

IdxNameSizeVMALMAFile offAlgn
索引段名段的长度虚拟地址加载地址偏移地址对齐

根据我们获得的各个段的信息我们可以得到目标文件大致的结构如下图所示:
elf结构
上面需要注意的是.bss段在elf中并不存在所以它的属性里面并没有content字段。.bss段是用来为未初始化的全局变量和局部静态变量预留位置而已,会在加载过程中用到。还有两块padding指的是对齐产生的空白段,第一段是.data进行4字节对齐产生的,第二段是.note.gnu.property进行8字节对齐产生的。

2. 各个段解析

2.1 .text段

2.2 .data段

2.3 .bss段

3. ELF文件结构解析

相关文章:

  • CAS单点登录(第7版)21.可接受的使用政策
  • ai数字人分身系统开发源码saas化
  • 今日写题04work
  • 为何STL里stack queue没有迭代器
  • .NET版Word处理控件Aspose.Words教程:使用 C# 删除 Word 中的空白页
  • AI 编程工具—Cursor 进阶篇 数据分析
  • 【java】深拷贝和浅拷贝的区别
  • ISO9001质量管理体系 | 设计和开发控制程序
  • LeetCode字符串相关算法题(1)【C语言版】
  • PyQt6/PySide6 线程间通信(Signal/Slot)
  • Hasleo Backup Suite v5.0.2.3 多语种便携版:全能型数据守护神器详解
  • DockerFile优化镜像体积
  • 吸烟(抽烟)检测和识别1:吸烟(抽烟)数据集说明(含下载链接)
  • Java基础知识总结(四十八)--TCP传输、TCP客户端、TCP服务端
  • 蓝桥杯---颜色分类(leetcode第75题)题解
  • 非谓语动词三驾马车
  • .NET 9.0 的 Blazor Web App 项目,Bootstrap Blazor 全局异常 <ErrorLogger> 使用备忘
  • 【计算机网络】传输层数据段格式
  • webassembly009 transformers.js 网页端侧推理 whisper-web
  • NSCoding 与归档解档
  • 巴基斯坦军方:印度导弹袭击巴首都附近空军基地
  • 构建菌株有效降解有机污染物,上海交大科研成果登上《自然》
  • 新修订的《婚姻登记条例》明起施行,领证不用户口本了
  • 马上评丨规范隐藏式车门把手,重申安全高于酷炫
  • 第32届梅花奖终评启幕,上海京剧院《智取威虎山》满堂彩
  • 最快3天开通一条定制公交线路!上海推出服务平台更快响应市民需求