目标文件

目标文件

1. 概述

编译器编译源代码后生成的文件叫做目标文件。目标文件就是源代码编译后但未进行链接的那些中间文件(Windows的.obj和Linux下的.o),它跟可执行文件的内容与结构很相似。

目标文件从结构上讲,是已经编译后的可执行文件格式,只是还没有经过链接的过程,其中可能有些符号或有些地址还没有被调整。它本身就是按照可执行文件格式存储的,只是跟真正的可执行文件在结构上稍有不同。

2. 目标文件格式

主要是Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format),它们都是COFF(Common file format)格式的变种。

不止可执行文件(Windows的.exe和Linux下的ELF可执行文件)按照可执行文件格式存储。动态链接库(DLL, Dynamic Linking Library)(Windows的.dll和Linux的.so)及静态链接库(Static Linking Library)(Windows的.lib和Linuxde的.a)文件都按照可执行文件格式存储在Windows下都按照PE-COFF格式存储,Linux下按照ELF格式存储

ELF文件分类:

ELF文件类型说明实例
可重定位文件(Relocatable File)包含了代码和数据,可被用来链接成可执行文件或共享目标文件,静态库也可以归为这一类Linux的.o; Windows的.obj
可执行文件(Executable File)包含了可以直接执行的程序,它的代表就是ELF可执行文件,它们一般都没有扩展名比如/bin/bash文件;Windows的.exe
共享目标文件(Shared Object File)包含了代码和数据。在两种情况下使用,一是链接器可以用这种文件跟其他的可重定位文件和共享目标文件链接产生新的目标文件;二是动态链接器可以将几个这种共享目标文件与可执行文件结合,作为进程映像的一部分来运行Linux的.so; Window的DLL
核心转储文件(Core Dump File)当进程意外终止时,系统可以将该进程的地址空间的内容及终止时的一些其他信息转储到核心转储文件Linux下的core dump

3.目标文件内容

目标文件中的内容有编译后的机器指令代码数据,还包括链接时需要符号表调试信息字符串等。

目标文件将这些信息按不同的属性,以“”(Section)的形式存储,有时也叫“段”(Segment)。

ELF结构:

ELF Header
.txt
.data
.bss
other sections
Section header table
String Tables\Symbol Tables

文件头描述了整个文件的属性,包括文件是否可执行、是静态链接还是动态链接及入口地址、目标硬件、目标操作系统等信息。

编译后执行语句的机器代码保存在.txt段。

已初始化的全局变量和局部静态变量都保存在.data段。

未初始化的全局变量和局部静态变量放在.bss段,.bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它并没有内容,所以它在文件中也不占据空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值