天天看点

ELF文件头读取修改

ELF = Executable and Linkable Format,可执行连接格式,是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的。扩展名为elf。

ELF 文件有三种类型:可重定位文件:也就是通常称的目标文件,后缀为.o。共享文件:也就是通常称的库文件,后缀为.so。可执行文件:本文主要讨论的文件格式,总的来说,可执行文件的格式与上述两种文件的格式之间的区别主要在于观察的角度不同:一种称为连接视图(Linking View),一种称为执行视图(Execution View)。

一个典型的ELF文件有两种描述视图:program header和section header.

program header:是对程序运行时所使用的段的描述.

section header: 是对所有二进制段的描述.

每一个ELF文件是由一个ELF 文件头(ELF header)和其余的文件数据构成.这些文件数据包括一下一些内容:

·Program header table 描述0个或是多个段(segments)

·Section header table, 描述0个或是多个节(sections)

·要写到上面两个表中的数据.

段(segments)包含的是程序运行是必要的信息

节(sections)包含的是链接和重定向时所需要的重要数据

同一时间整个文件中的每个beyt不会属于一个以上的段,但是也可以存在不属于任何段的字节.

linux下ELF文件分析工具:

readelfis: 是一个unix下的二进制工具,用来显示一个或多个ELF文件的信息. 

elfdump: 是一个Solaris命令,用来查看单个ELF文件的信息.

objdump:     可以查看ELF文件或是其它对象格式的更多信息.

关键词:Dynamic binding/ld.so/mdb/link map/Solaris

1. 基本概念

Link-Editor - 链接器:即ld(1),输入一个或多个输入文件(*.o  234    addr = (ulong_t)JMPREL(lmp);  235    rptr = (Rel *)(addr + reloff);  236    rsymndx = ELF_R_SYM(rptr->r_info);  237    sym = (Sym *)((ulong_t)SYMTAB(lmp) + (rsymndx * SYMENT(lmp)));  238    name = (char *)(STRTAB(lmp) + sym->st_name);  239