目标文件中的内容至少有编译后的机器指令代码、数据。
除了这些内容以外,目标文件中还包括了链接时所须要的一些信息,比如符号表、调试信息、字符串等。一般目标文件将这些信息按不同的属性,以"节"(Section)的形式存储,有时候也叫"段"(Segment),在一般情况下,它们都表示一个一定长度的区域,基本上不加以区别,唯一的区别是在ELF的链接视图和装载视图的时候。
程序源代码编译后的机器指令经常被放在代码段(Code Section)里,代码段常见的名字有".code"或".text";全局变量和局部静态变量数据经常放在数据段(Data Section),数据段的一般名字都叫".data"。让我们来看一个简单的程序被编译成目标文件后的结构,如图所示。
从图中可以看到,ELF文件的开头是一个"文件头",它描述了整个文件的文件属性,包括文件是否可执行、是静态链接还是动态链接及入口地址(如果是可执行文件)、目标硬件、目标操作系统等信息,文件头还包括一个段表(Section Table),段表其实是一个描述文件中各个段的数组。段表描述了文件中各个段在文件中的偏移位置及段的属性等,从段表里面可以得到每个段的所有信息。文件头后面就是各个段的内容,比如代码段保存的就是程序的指令,数据段保存的就是程序的静态变量等。
一般C语言的编译后执行语句都编译成机器代码,保存在.text段;已初始化的全局变量和局部静态变量都保存在. data段;未初始化的全局变量和局部静态变量一般放在一个叫."bss"的段里。我们知道未初始化的全局变量和局部静态变量默认值都为0,本来它们也可以被放在.data段的,但是因为它们都是0,所以为它们在.data段分配空间并且存放数据0是没有必要的。程序运行的时候它们的确是要占内存空间的,并且可执行文件必须记录所有未初始化的全局变量和局部静态变量的大小总和,记为.bss段。所以.bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它并没有内容,所以它在文件中也不占据空间。
分享到:
相关推荐
《RT-Thread 文件系统应用笔记》是针对RT-THREAD实时操作系统中文件系统应用的一份详细指南。RT-THREAD是由上海睿赛德电子科技有限公司开发的一款开源、轻量级、高性能的实时操作系统,它提供了丰富的功能组件,其中...
在学习过程中,建议先阅读笔记理解项目背景和目标,然后运行`cloud.sql`建立数据库,接着研究并理解`.jar`文件中的库和框架,最后通过编写和调试代码来实现项目功能。这样的步骤会让你的自学过程更加有序和高效。
本文将深入探讨“Linux工作笔记”中涉及的一些关键知识点,包括select多路复用、Makefile文件、Shell脚本、DDNS(动态域名解析)、文件读写、编译内核、鸟哥私房菜Linux教程、转义字符、版本控制工具SVN以及Makefile...
本学习笔记将深入探讨如何进行根文件系统的移植,以构建一个最小化但功能完整的系统。 首先,我们需要理解根文件系统的基本概念。根文件系统是指Linux系统启动时挂载的第一个文件系统,通常包含了/etc、/bin、/lib...
这些结构体包含了PE文件的元数据信息,如文件版本、目标平台等信息。 4. 节(块)表(Section Table):节表位于PE文件的内存布局中,列出了文件中所有的节。每个节都有特定的属性,包括节的名称、虚拟大小、虚拟...
### Hex文件格式学习笔记 #### 一、Intel HEX 文件简介 Intel HEX文件是一种常见的ASCII文本文件格式,主要用于存储机器语言代码或常量数据,并且能够方便地被传输至ROM(只读存储器)或EPROM(可擦除可编程只读...
本笔记将详细介绍SSH映射文件配置的三个核心部分:基础配置参数使用、多对一映射以及一对多映射。 **基础配置参数使用** SSH的基础配置通常位于`~/.ssh/config`文件中,此文件可以定义不同的主机别名和相关设置。...
在深入探讨嵌入式Linux开发笔记之前,我们需要了解一些基础的概念与流程,这有助于理解笔记中所述内容。 GCC是GNU编译器集合(GNU Compiler Collection)的缩写,它是一个用于编译C、C++、Objective-C、Fortran、...
在1.7.1节中,笔记提到了目标代码文件、可执行文件和库的概念。目标代码文件是编译器生成的中间产物,包含了机器语言但尚未完全链接;可执行文件是程序的最终形式,可以直接运行;库则是一组预编译的函数和数据结构...
这篇学习笔记主要涵盖了几个经典的深度学习目标检测模型,包括R-CNN、Fast R-CNN和Faster R-CNN,以及单阶段检测器SSD和YOLO系列。此外,还介绍了数据集的使用和目标检测的评估指标。 一、数据集与标注工具 PASCAL ...
Simics with Gems 安装笔记是一篇关于安装 Simics 和 GEMS 组件的详细指南。该笔记涵盖了从安装 Simics 和 GEMS 到使用 Simicsfs 加载本地文件的所有步骤。下面是该笔记中的关键知识点: 1. 安装 Simics 和 GEMS ...
- **特殊目标**:除了常规的目标文件外,还可以定义一些特殊目标,如 `clean`,用于清理项目中的临时文件。 ```makefile clean: rm -f *.o my_program ``` 这里 `clean` 目标没有依赖项,命令行是删除所有 `....
这个功能的主要目标是确保用户的数据安全,防止因网络问题或服务中断导致的数据丢失。通过将笔记导出为JSON(JavaScript Object Notation)格式,数据得以结构化存储,方便后续处理和分析。 描述中提到,下载的内容...
最后,笔记可能会包含一些实战项目或示例,让读者能够在实践中巩固所学知识,例如构建Web服务器、实现并发任务调度器或者进行文件操作等。 总的来说,《Golang学习笔记第四版》是一份覆盖Go语言全方位知识的教程,...
这份"笔记模板华为安卓计划表康奈尔素材贴纸电子手帐模板.zip"文件正是为此目的而设计的。这份资源集合了多种功能和元素,旨在帮助用户更有效地组织信息,提升学习和工作效率。 首先,我们来了解一下“康奈尔笔记法...
在开发过程中,编译器和链接器生成ELF文件,但这种格式不适合直接加载到目标硬件上,因为它包含了一些在运行时不需要的额外信息。 然后,我们来讨论如何将ELF转换为bin文件。bin文件(二进制文件)是纯二进制形式,...
PCL学习笔记是关于如何使用PCL库进行点云处理的学习文档。在该笔记中,作者详细介绍了在PCL学习过程中常见的函数,并通过图形和文字说明这些函数的使用方法。 ### 标签 文档的标签为“pcl点云库 pcl点云学习笔记”...
链接器(linker)将多个目标文件合并,解决外部引用,生成可执行文件。 五、内存管理 C语言提供了malloc()和free()函数进行动态内存分配和释放。理解内存的堆栈分配原理,正确使用内存管理,是避免内存泄漏和程序...
为了在 Keil(MDK)中新建一个工程,需要点击桌面图标,在 PROJECT 菜单下,选择 open project,找到目标文件所在的文件夹,点击后缀为.Uv 的文件,就能打开已有的工程。在新建工程时,需要添加库函数的 LIB 文件,...
### Talend学习笔记2——mysql文件导入到HDFS #### 关键知识点概览 - **Talend Data Integration** - **MySQL 数据库** - **Hadoop 和 HDFS(Hadoop Distributed File System)** #### 详细知识点说明 ##### 1. ...