初识elf文件格式

在linux或者unix系统中,所有的东西都被视为文件,因此可以认为她们都是由不同的文件构成的(可以这么说吧,linux或者unix是一个文件集合,这只是个人的看法),因此可以说linux或者unix编程就是为了处理文件,如何高效的处理文件,而 elf(executable linking and format),可执行二进制文件,则是其中的一种。目前她是linux或者unix的标准可执行二进制文件格式

 

为了更好的了解她,下面先介绍几个小软件:第一个登场的是readelf,她由Eric Youngdale 所写,作者也是为了了解elf而写了这个小工具,readelf显示一个或多个elf格式的目标文件信息,还可以反汇编(具体看手册),可通过各种参数选项来控制显示目标文件的特定信息;第二个则是nm,主要功能是列出目标文件中的符号,这样可以帮助程序员定位和分析程序和目标文件中的符号信息;还有就是objdump显示文件的特定信息,ar用于创建、修改、提取归档文件,objcopy转换文件格式(只能是BFD库中所描述的文件格式)。工具描述告一段落。

现在我们以一个简单的hello world程序开始下面的旅程(上C语言课上的第一个程序,应该记得吧)。gcc 编译生成一个标准的可执行文件,接着readelf -a yourfilename。阿呀,怎么这么多东西?确实有点恐怖(因为内容过于丰富,这里就不展示了)。所以找到了一种更直接的方式,去看elf文件的定义(在/usr/include/elf.h中有elf的更详细的结构定义,或者你也可以man elf,linux自身附带的文档也是很丰富的)。

以上是自己了解elf的一些方法,下面介绍对elf文件的一些了解。

首先是elf文件的头部(用readelf -h filename,就能看到elf文件头信息)
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x80482f0
Start of program headers: 52 (bytes into file)
Start of section headers: 3220 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 7
Size of section headers: 40 (bytes)
Number of section headers: 36
Section header string table index: 33

Magic字段用16字节来明确定义这一个elf文件,换句话说,Magic对于elf文件是唯一的。Class这标明这是哪种elf文件(其实elf文件还可分为 elf32-i386、elf32-little、elf32-big、elf64-x86-64、elf64-little、elf64-big),可真多,所以我也只是对她们略知一二,应该是很少了。剩下的信息理解应该是没什么问题了,这里就不废话了。还有些如符号链接,程序断,入口地址,以及程序使用了哪些库,她们的物理地址和虚拟地址如何安排等信息,用readelf就能一探究竟了。我不想把这篇作为深入理解elf文件的文章,再说我暂时也没那能力。因为最近有些东西要用到,所以只是作为自身够用的原则。

下面介绍一些了解elf文件过程中找到的一些材料:首当其冲的是:

http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html,这篇文章描述了作者如何在了解elf文件的情况下,把一个可执行的elf文件从 3998字节疯狂的减到42字节,牛啊!

其二是:http://www.linuxjournal.com/article/1060,这篇文章是readelf的作者所些的,应该有些参考价值

http://www.linuxforums.org/misc/understanding_elf_using_readelf_and_objdump.html,教你如何用readelf和objdump一步步了解elf文件

http://netwinder.osuosl.org/users/p/patb/public_html/elf_relocs.html。如果想深入了解elf文件的上面的资料应该够入门了,哈哈!就先这样了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值