Linux下目标文件分析
时间:2016-12-13作者:华清远见
1. 程序源码如下: 2.命令 gcc –E simple_section.c –o simple_section.i 3. Elf文件头 ELF目标文件格式的前部是ELF文件头,它包含了描述整个文件的基本属性,包括ELF魔数、文件机器字节长度、数据存储方式、版本、运行平台、ABI版本、ELF重定位类型、硬件平台、硬件平台版本、入口地址、程序头入口和长度、段表的位置和长度及段的数量等。 文件头的结构体定义如下: 使用"readelf –h"命令可以查看目标文件头文件的内容: magic是结构体的第一个成员e_indent,16个字节: 4. 段表 ELF文件中有很多段,段表就是保存这些段的基本属性的结构。包括每个段的段名、段的长度、在文件中的偏移、读写权限及段的其他属性。也就是说ELF文件段的结构式由段表决定的,编译器、连接器和装载器都是依靠段表来定位和访问各个段的属性的。 段表的定义如下: "objdump –h"命令只是显示关键段,省略了辅助性的段。"readelf -S"命令显示的更完整。 已初始化的全局变量和局部静态变量,都保存在.data段。未初始化的全局变量和局部静态变量一般放在.bss段。 但是,这个例子里,bss段只占4个字节。 通过下面的符号表,可以看出只有static_var2变量放在了bss段中,global_uninit_var并没有放在任何的,只是一个未定义的"COMMON符号",这和编译器有关,全局的未初始化变量,有的放在bss 段,有的则不放,只是预留一个未定义的全局变量符号,等到终链接成可执行文件的时候,再在bss段分配空间。 备注: start of section headers是372字节,十六进制后是0x00000174。和下图中section table的起始地址是一致的。 再结合"readelf –S simple_section"的结果,注意Al属性,会有对齐,可以画出下面的图: 后的0x51c刚好是1308字节,是simple_section.o的大小。
相关资讯
发表评论
|