现在的位置: 首页 > 综合 > 正文

程序员的自我修养 – 目标文件

2012年04月19日 ⁄ 综合 ⁄ 共 1267字 ⁄ 字号 评论关闭

 有点坑爹,刚才写的文章,现在要重新写过.

 

在上篇博文中,最后生成的是object files,也就是目标文件.

 

目标文件在不同的平台,有不同的种类.windows下就有流行的PE(Portable Executable),linux下有ELF(EXECUTABLE LINKABLE FORMAT).我只关心linux下的.

查阅了一些资料,这里总结一下.先来看一下ELF的文件类型.首先看看我们生成的helloworld.o的文件类型.

这里是什么意思?慢慢解释.

在书中,作者添加了一种:

核心转储文件(Core Dump File)   当进程意外终止时,系统可以将该进程的地址空间的内同及终止时的一些其他信息转储到核心转储文件.

 相信的资料可参考链接:   http://en.wikipedia.org/wiki/Core_dump   http://linux.die.net/man/5/core

目标文件既要参与程序链接又要参与程序执行。出于方便性和效率考虑,目标

文件格式提供了两种并行视图

 

一般的 ELF 文件包括三个索引表:ELF header,Program header table,Section header table。

ELF header:在文件的开始,保存了路线图(road map),描述了该文件的组织情况。

Program header table:告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表
。
Section header table:包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称、节区大小这类信息。用于链接的目标文件必须包含节区头部表,其他目标文件可以有,也可以没有这个表

 什么是节区呢?

 

下面借助工具来简单分析一下helloworld.o中的信息.

 程序的源码如下:

 #include <stdio.h>
 #include <stdlib.h>

 static int global_test_var = 100;
 
int main(int args, char ** argv)
 {

         static int var=20;
         printf("%s\n","程序员的自我修养!");
 
        return EXIT_SUCCESS;
 }

 

在.data节区中, 64000000,,f共四个字节,使用十六进制表示.  0x64 0x00 0x00 0x00, 转换成为二进制就是100,也就是源码中的global_test_var,

后面的14000000同理,就是var.

 

下面来看看目标文件的结构:(由于有很多的节区,所以只给出重要的节区,)

其中.text节区保存的是程序指令,而,data和.bss中保存的是程序数据.

 关于.bss节区的一些解释:

.bss段只是为了给未初始化的全局变量和局部静态变量预留位置.

 

 另外,在书中说.rodata,也就是只读节区,存放的应该是只读数据.在上面的测试源码中输出了"程序员的自我修养!",这句字符串就应该是保存在.rodata节区中。

 

另外需要补充的就是,在很多的资料中说的节区就是书中说的段。

 

 

【上篇】
【下篇】

抱歉!评论已关闭.