ELF (Excutable and Linkable Format)是Linux目前所使用的可执行文件格式。我们在linux系统上经常./binary来执行的文件就是这个家伙。
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 #include <stdio.h>
-
2 #include <stdlib.h>
-
3
-
4 extern char * _binary_a_c_start;
-
5 int main()
-
6 {
-
7 printf("%s", (char *)&_binary_a_c_start);
-
8 }
cat Makefile
- 1 CC=gcc
-
2 CFLAG=
-
3
-
4 test: a.c a.bin
-
5 $(CC) $(CFALG) -o $@ $^
-
6 a.bin: a.c
-
7 objcopy -I binary -O elf32-i386 -B i386 $< $@
-
8
-
9 clean:
-
10 rm -rf test a.bin
生成出来的可执行文件会是什么效果呢?
阅读(1498) | 评论(0) | 转发(0) |