Chinaunix首页 | 论坛 | 博客
  • 博客访问: 954876
  • 博文数量: 109
  • 博客积分: 1751
  • 博客等级: 上尉
  • 技术积分: 1817
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-31 22:37
文章分类

全部博文(109)

文章存档

2014年(9)

2013年(21)

2012年(48)

2011年(31)

分类: LINUX

2011-08-24 16:16:51

ELF (Excutable and Linkable Format)是Linux目前所使用的可执行文件格式。我们在linux系统上经常./binary来执行的文件就是这个家伙。
关于ELF格式的详细文档,可以参考《Executable and Linkable Format (ELF)》,这相当于是ELF的SPEC。

1,ELF格式的基本结构
简单的说,ELF格式如下图所示。
其包含ELF header, Program header table, Section header table, Sections.
ELF header包括0x7f"ELF"的magic number,type, arch, version等信息,通过ELF header,加载器就可以知道此文件是否可以执行。
Program header table包含程序装载时所需要的信息,主要是程序起始虚拟地址,即VMA;以及程序中各segment的entry。
Section header table包含各section的entry。

2,ELF格式分类
ELF属于OBJECT文件格式,有三种格式:
Relocatable File
Executable File
Shared Object File
对Executable File格式来说,Section header table不是必须的,对另外两种格式来说,Program header table不是必须的。

3,VMA!=LMA
VMA Virtual Memory Addr
LMA Load Memory Addr
这个概念ELF里貌似没有,难道是因为所有的ELF格式的Object,其VMA都与LMA相等?
VMA!=LMA的情况发生在嵌入式系统中,即程序被烧写到ROM中,但被拷贝到RAM中执行。有待了解。

4,使用objcopy可以将elf格式转化了binary格式,使用objdump可以查看elf格式的信息。
如objdump -x -b -S elffile
实际上,objcopy解析了elf格式,并将各section的内容提取出来,按照其地址信息填充,空白的地方填充0,所以binary格式往往比elf格式更大。

5,有如下程序
cat a.c
  1. 1 #include <stdio.h>
  2.   2 #include <stdlib.h>
  3.   3
  4.   4 extern char * _binary_a_c_start;
  5.   5 int main()
  6.   6 {
  7.   7 printf("%s", (char *)&_binary_a_c_start);
  8.   8 }
cat Makefile
  1. 1 CC=gcc
  2.   2 CFLAG=
  3.   3
  4.   4 test: a.c a.bin
  5.   5 $(CC) $(CFALG) -o $@ $^
  6.   6 a.bin: a.c
  7.   7 objcopy -I binary -O elf32-i386 -B i386 $< $@
  8.   8
  9.   9 clean:
  10.  10 rm -rf test a.bin
生成出来的可执行文件会是什么效果呢?
阅读(1427) | 评论(0) | 转发(0) |
0

上一篇:proc 简单使用

下一篇:ABI & EABI

给主人留下些什么吧!~~