目标文件

目标文件的格式

目标文件是源码编译后但未进行链接的文件,如(windows的.obj和linux下的.o),它与可执行文件的格式类似(Windows下的PE,linux下的ELF)。另外,动态链接库、静态链接库、core文件都按照可执行文件格式存储。

ELF格式的文件有四类:

可重定向文件:这类文件包含代码和数据,可以用来生成可执行文件和共享目标文件。包括目标文件和静态库文件,静态库文件可以看穿多个目标文件的打包。

可执行文件:可以直接执行的文件。

共享目标文件:这类文件包含了代码和数据。有两种用途:(静态文件)连接器可以将其与其它可重定向文件或共享目标文件链接,从而产生新的目标文件;(动态进程)动态连接器可以将多个共享目标文件和可执行文件链接,作为进程的一部分。

核心转存文件(core文件):进程意外终止时,保持进程空间地址内容及其他信息。

可以通过命令:file 文件名,获取文件的类型。

 

目标文件的内容

目标文件文件主要包含文件头、源码编译后保留信息(数据、代码)和链接时所需要信息(符号表、字符串等)。目标文件将这些不同属性的信息以段的方式保存。

文件头包含了文件类型、执行文件入口地址、目标操作系统等,另外还包含一个段表,记录各段在文件中的偏移及属性。文件头后面就是各段的内容。

源码编译后的信息主要保存在数据段(.data section、.bss section)、代码段(.text section)中。编译后的机器代码保存在代码段中,初始化的全局变量和局部静态变量保存在.data段中,未初始化的全局变量和局部静态变量保存在.bss段中。

Bss段只为未初始化的全局变量和局部静态变量预留位置,并没有内容,在目标文件中不占空间(可以理解为仅在段表中有信息:大小、位置偏移等)。有些全局未初始化的变量不会放到目标文件的bss段,会等最终链接时在放到bss段,这于强符号和弱符号有关。当全局变量和局部静态变量被初始化为0时,会被放到bss段中,因为未初始化都是0。

可以用命令 objdump -h 文件名,查看目标文件的结构及内容;-h显示ELF文件各段的基本信息,-x显示详细信息,-s可以将所有段的内容以十六进制的方式打印出来,-d可以将包含指令的段反汇编。

有些编译器会生成.rodata段,存放只读数据(const修饰的变量及字符串常量)。

Gcc提供一个扩展机制,可以指定变量所处的段(name)。

__attribute__((section(“name”))) int global;

转载于:https://my.oschina.net/u/1777349/blog/1807244

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值