《编译系统-自底向上研究方法》ELF格式简介 - 弦外之音

/ 0评 / 0

编译系统的编译流程如下,摘自《深入理解计算机系统》。

从上面的流程图可看出,编译系统的最后一步是生成 可执行文件 hello 。在前面一步,是 ld 链接器把 多个 .o 文件 链接在一起。由于本书叫 ”自底向上研究方法“,所以肯定是从最后一步开始讲。

最后一步是什么?最后一步就是运行 可执行文件 hello。而 hello 是一个二进制文件,不是 ASII 码,用文本编辑器打开会显示一堆乱码。但是二进制文件,他肯定是有格式,有规范的,例如前面几个字节是什么,各个字段的内容空间多少,如何排列布局,这些肯定是有标准的。就类似于 网络协议,IP,UDP,TCP,这些协议在网络传输的时候也是二进制的,不是ASII码,如下图:

从上图可以看出,两个字节 c2 00 ,他们是 UDP 的 source port 源端口字段的内容。上面这个软件是 Wireshark ,用来分析网络数据的二进制内容。所以 二进制文件,是不能用 普通的文本编辑器查看修改的,必须有专用的软件才能看到具体的内容。

网络协议的标准是 TCP/IP ,有很多个 RFC 的,我不列举了。这些 RFC 规定了各个字段的大小,位置。在 Linux 环境,可运行的二进制文件的格式是 ELF 格式,标准文档是 《Tool Interface Standard (TIS) Executable and Linking Format (ELF) Specification》

本文主要讲解的就是 ELF 文件格式。



为了方便读者对着,先给出一个源码包,下载地址:百度网盘,提取码:cat1 ,里面有 3个 文件,main.csum.cmain

main 是一个可执行文件,是用 以下命令编译出来的。

gcc -o main main.c sum.c

这里提醒一下,我的环境是 windows10 + ubuntu18,main 我是从 ubuntu 拷贝到 windows10 的,我习惯在 windows 环境分析,main 在 windows 环境是无法运行的


main 是一个 ELF 格式的二进制文件,上面提过,要用专门的软件才可以比较方便查看内容,下面推荐几款工具。

第一个,notepad++ 32位,只有32位才有二进制插件。截图如下:

notepad++ 这个软件可以看到最原始的二进制内容,左边还有一个地址位置。不过因为展示的都是16进制码,我也无法从肉眼分析出这些 00 04 45 是什么东西,我通常用这个软件来对着某些字段的偏移值,验证一下自己的思考是否正确。


第二个是 xelfviewer ,这是一个跨平台的工具 ,支持 windows ,linux ,mac,截图如下:

xelfviewer 这个工具非常强大,跟 wireshark 类似,可以对着 16 进制内容看各个字段。

还有一些其他工具,elfparserida64


由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1,QQ:2338195090。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注