联想笔记本电脑g480-ios13 1 3

0x000000f4
2023年3月30日发(作者:大学生用的笔记本)

Linux可执行文件格式

•Elf也就是“ExecutableandLinkingFormat.”

•Elf起源于Unix,经改进应用于FreeBSD和Linux等现有类Unix操作系统。

•微软的PE格式也学习了ELF格式的优点。

•ELF文档服务于在不同的操作系统上目标文件的创建或者执行文件的开发。它分以

下三个部分:

•“目标文件”描述了ELF目标文件格式三种主要的类型。

•“程序装载和动态连接”描述了目标文件的信息和系统在创建运行时程序的

行为。

•“C语言库”列出了所有包含在libsys中的符号、标准的ANSIC和libc的运

行程序,还有libc运行程序所需的全局的数据符号。

三种主要类型:

•一个可重定位文件(relocatablefile)保存着代码和适当的数据,用来和其他的目标文

件一起来创建一个可执行文件或者是一个共享文件。

•一个可执行文件(executablefile)保存着一个用来执行的程序,该文件指出了

exec(BA_OS)如何来创建程序进程映象。

•一个共享目标文件(sharedobjectfile)保存着代码和合适的数据,用来被下面的两

个链接器链接。第一个是链接编辑器,可以和其他的重定位和共享目标文件来创建

另一个目标文件。第二个是动态链接器,联合一个可执行文件和其他的共享目标文

件来创建一个进程映象。

ELF的结构

ELFheaderELFheader

Programheadertable

(optional)

Programheadertable

Section1Segment1

…Segment2

Sectionn…

……

……

SectionheadertableSectionheadertable

(optional)

ELF头

•#defineEI_NIDENT16

•typedefstruct{

•unsignedchare_ident[EI_NIDENT];

•Elf32_Halfe_type;

•Elf32_Halfe_machine;

•Elf32_Worde_version;

•Elf32_Addre_entry;

•Elf32_Offe_phoff;

•Elf32_Offe_shoff;

•Elf32_Worde_flags;

•Elf32_Halfe_ehsize;

•Elf32_Halfe_phentsize;

•Elf32_Halfe_phnum;

•Elf32_Halfe_shentsize;

•Elf32_Halfe_shnum;

•Elf32_Halfe_shstrndx;

•}Elf32_Ehdr;

常用标示

名称偏移量目的

EI_MAG00

e_ident[EI_MAG0]toe_ident[EI_MAG3]:文

件的前4个字符保存一个魔术数(magic

number),用来确定该文件是否为ELF的目标

文件。参见表7-7

EI_MAG11

EI_MAG22

EI_MAG33

EI_CLASS4

e_ident[EI_CLASS],用来确定文件的类型或

者说是容量。参见表1-8

EI_DATA5

e_ident[EI_DATA]指定了在目标文件中特定

处理器数据的编码方式。参见表1-9

EI_VERSION6

e_ident[EI_VERSION]表明了ELF头的版本

号。现在这个变量的值一定要设为

EV_CURRENT,参见表7-5

EI_OSABI7

操作系统和ABI的标识

EI_ABIVERSION8

ABI版本

EI_PAD9

e_ident[EI_PAD]标识了在e_ident中开始的未

使用的字节,那些字节保留并被设置为0。程

序把它们从目标文件中读出但应该忽略。如

果当前未被使用的字节有了新的定义,

EI_PAD变量将会被改变。

EI_NIDENT16

e_ident[]的长度

•一个目标文件的节头表可以让我们定位所有的节。节头表是一个Elf32_Shdr结构的

数组。一个节头表的索引是这个数组的下标。

•ELF头结构中的e_shoff成员给出了节头表的偏移量(从文件开始计数)。

•e_shnum告诉我们节头表中包含了多少个表项;

•e_shentsize给出了每个表项的长度。某些节头表索引是保留的,这些索引在目标文

件中没有与之对应的节。

•typedefstruct{

•Elf32_Wordsh_name;

•Elf32_Wordsh_type;

•Elf32_Wordsh_flags;

•Elf32_Addrsh_addr;

•Elf32_Offsh_offset;

•Elf32_Wordsh_size;

•Elf32_Wordsh_link;

•Elf32_Wordsh_info;

•Elf32_Wordsh_addralign;

•Elf32_Wordsh_entsize;

•}Elf32_Shdr;

字符串表

•字符串表节(Stringtablesections)保存着以NULL终止的一系列字符,一般我们称

为字符串。目标文件使用这些字符串来表示符号和节名。一个字符串的引用是一个

字符串表节的索引。

字符表

•一个目标文件的符号表(symboltable)保存了定位和重定位程序的定义和引用的信

息。一个符号表索引是相应的下标。0表项特指了该表的第一个表项,就象未定义

的符号索引一样。

重定位(Relocation)

•重定位(Relocation)是链接符号引用和符号定义的过程。比如,当一个程序调用一

个函数的时候,相关的调用必须在执行时把控制传送到正确的目标地址。换句话说,

重定位文件应当包含如何修改他们的节内容的信息,从而允许可执行文件或共享目

标文件为一个进程的程序映像保存正确的信息。

程序头

•一个可执行的或共享的目标文件的程序头表是一个结构数组,每一个结构描述一个

段或其他系统准备执行该程序所需要的信息。一个目标文件段包含一个或多个部分

(就象下面的“段目录”所描述的那样)。程序头仅仅对于可执行或共享的目标文件有

意义。

•typedefstruct{

•Elf32_Wordp_type;

•Elf32_Offp_offset;

•Elf32_Addrp_vaddr;

•Elf32_Addrp_paddr;

•Elf32_Wordp_filesz;

•Elf32_Wordp_memsz;

•Elf32_Wordp_flags;

•Elf32_Wordp_align;

•}Elf32_Phdr;

段内容实例

TextSegmentDataSegment

程序载入

当创建或增加一个进程映像的时候,系统在逻辑上将拷贝一个文件的段到一个虚拟

的内存段

动态链接

•程序解释器(ProgamInterpreter)

–系统为解释器“编写”了一个内存映像,而不是使用原始的可执行文件的段映

像。此时该解释器就负责接收来自系统的控制并且为应用程序提供一个环境

变量。

•动态链接器(DynamicLinker)

–当使用动态链接方式建立一个可执行文件时,链接器把一个PT_INTERP类

型的元素加到可执行文件中,告诉系统像该系统的解释器一样调用动态链接

器。

•动态节(DynamicSection)

–如果一个目标文件参与动态的链接,它的程序头表将有一个类型为

PT_DYNAMIC的元素。该“段”包含了.dynamic节。一个_DYNAMIC特别的

符号,表明了该节包含了以下结构的一个数组。

•共享目标的依赖关系(SharedObjectDependencies)

–当链接器处理一个文档库时,它取出库中成员并且把它们拷贝到一个输出的

目标文件中。当运行时没有包括一个动态链接器的时候,那些静态的链接服

务是可用的。共享目标也提供服务,动态链接器必须把正确的共享目标文件

链接到要执行的进程映象中。因此,可执行文件和共享的目标文件之间存在

着明确的依赖性。

•全局偏移量表(GlobalOffsetTable,GOT)

–全局偏移量表在私有数据中保存着绝对地址,所以在不影响位置无关性和程

序代码段共享能力的情况下应该使地址是可用的。一个程序参考它的

GOT(使用位置无关的地址)并提取绝对的地址,所以与重定向无关的位置定

位到绝对的位置。

•PLT过程连接表(ProcedureLinkageTable)

–正如GOT重定位把位置无关的地址计算成绝对地址一样,PLT过程链接表

重定向那些与位置无关的函数调用到绝对的地址。

简单的C程序及其ELF格式信息

intxx,yy;

main()

{

xx=1;

yy=2;

printf("xx%dyy%dn",xx,yy);

}

ELF头信息

root#

:fileformatelf32-i386

architecture:i386,flags0x00000112:

EXEC_P,HAS_SYMS,D_PAGED

startaddress0x080483dc

程序头

ProgramHeader:

PHDRoff0x00000034vaddr0x08048034paddr0x08048034align2**2

filesz0x000000c0memsz0x000000c0flagsr-x

INTERPoff0x000000f4vaddr0x080480f4paddr0x080480f4align2**0

filesz0x00000019memsz0x00000019flagsr--

LOADoff0x00000000vaddr0x08048000paddr0x08048000align2**12

filesz0x00000564memsz0x00000564flagsr-x

LOADoff0x00000564vaddr0x08049564paddr0x08049564align2**12

filesz0x000000a8memsz0x000000ccflagsrw-

DYNAMICoff0x0000059cvaddr0x0804959cpaddr0x0804959calign2**2

filesz0x00000070memsz0x00000070flagsrw-

NOTEoff0x00000110vaddr0x08048110paddr0x08048110align2**2

filesz0x00000018memsz0x00000018flagsr--

Dynamic节

DynamicSection:

.4

INIT0x8048390

FINI0x8048550

HASH0x8048128

STRTAB0x80482c8

SYMTAB0x80481b8

STRSZ0xad

SYMENT0x10

DEBUG0x0

PLTGOT0x8049584

PLTRELSZ0x18

PLTREL0x11

JMPREL0x8048378

节头表

Sections:

IdxNameSizeVMALMAFileoffAlgn

80f4080480f4000000f42**0

CONTENTS,ALLOC,LOAD,READONLY,DATA

-tag811001102**2

CONTENTS,ALLOC,LOAD,READONLY,DATA

812801282**2

CONTENTS,ALLOC,LOAD,READONLY,DATA

81b8080481b8000001b82**2

CONTENTS,ALLOC,LOAD,READONLY,DATA

000000ad080482c8080482c8000002c82**0

CONTENTS,ALLOC,LOAD,READONLY,DATA

837803782**2

CONTENTS,ALLOC,LOAD,READONLY,DATA

0000000b839**2

CONTENTS,ALLOC,LOAD,READONLY,CODE

839c0804839c0000039c2**2

CONTENTS,ALLOC,LOAD,READONLY,CODE

83dc080483dc000003dc2**2

CONTENTS,ALLOC,LOAD,READONLY,CODE

855005502**2

CONTENTS,ALLOC,LOAD,READONLY,CODE

0000000e8556000005562**0

CONTENTS,ALLOC,LOAD,READONLY,DATA

0000000c9564000005642**2

CONTENTS,ALLOC,LOAD,DATA

_frame957005702**2

CONTENTS,ALLOC,LOAD,DATA

957405742**2

CONTENTS,ALLOC,LOAD,DATA

957c0804957c0000057c2**2

CONTENTS,ALLOC,LOAD,DATA

958405842**2

CONTENTS,ALLOC,LOAD,DATA

c959c0804959c0000059c2**2

CONTENTS,ALLOC,LOAD,DATA

960c0804960c0000060c2**2

ALLOC

000001bcc2**2

CONTENTS,READONLY,DEBUGGING

r000007c82**0

CONTENTS,READONLY,DEBUGGING

t000000c8000000000b502**0

符号表

SYMBOLTABLE:

00000000

-tag00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

_frame00000000

00000000

00000000

00000000

c00000000

•00000000

•00000000

•r00000000

•t00000000

•00000000

•00000000ld*ABS*00000000

•00000000ld*ABS*00000000

•00000000ld*ABS*00000000

•00000000ldf*ABS*00000000crtstuff.c

•00000000gcc2_compiled.

•00000000p.3

•00000000__DTOR_LIST__

•00000000completed.4

•00000000__do_global_dtors_aux

•_frame00000000__EH_FRAME_BEGIN__

00000000fini_dummy

00000018object.11

00000000frame_dummy

00000000init_dummy

00000000force_to_data

00000000__CTOR_LIST__

00000000ldf*ABS*00000000crtstuff.c

00000000gcc2_compiled.

00000000__do_global_ctors_aux

00000000__CTOR_END__

00000000init_dummy

00000000force_to_data

00000000__DTOR_END__

_frame00000000__FRAME_END__

00000000ldf*ABS*00000000p10.c

080483acF*UND*00000031printf

0804959cgO*ABS*00000000_DYNAMIC

08048550gO*ABS*00000000_etext

00000000_init

00000004environ

00000000w*UND*00000000__deregister_frame_info

08049630gO*ABS*00000000end

00000004xx

00000004__progname

00000083_start

0804960cgO*ABS*00000000__bss_start

00000038main

00000000_fini

00000004yy

080483bcF*UND*00000070atexit

0804960cgO*ABS*00000000_edata

08049584gO*ABS*00000000_GLOBAL_OFFSET_TABLE_

08049630gO*ABS*00000000_end

080483ccF*UND*0000005bexit

00000000w*UND*00000000__register_frame_info

动态符号表

DYNAMICSYMBOLTABLE:

080483acDF*UND*00000031printf

0804959cgDO*ABS*00000000_DYNAMIC

08048550gDO*ABS*00000000_etext

00000000_init

00000004environ

00000000wD*UND*00000000__deregister_frame_info

08049630gDO*ABS*00000000end

00000004__progname

0804960cgDO*ABS*00000000__bss_start

00000000_fini

080483bcDF*UND*00000070atexit

0804960cgDO*ABS*00000000_edata

08049584gDO*ABS*00000000_GLOBAL_OFFSET_TABLE_

08049630gDO*ABS*00000000_end

080483ccDF*UND*0000005bexit

00000000wD*UND*00000000__register_frame_info

DebuggingInformation

intmain()

{/*0x80484e8*/

}/*0x80484e8*/

intmain()

{/*0x80484e8*/

/*file/usr/home/shieyuan/test/3addr0x80484ee*/

/*file/usr/home/shieyuan/test/5addr0x80484ee*/

/*file/usr/home/shieyuan/test/6addr0x80484f8*/

/*file/usr/home/shieyuan/test/7addr0x8048502*/

/*file/usr/home/shieyuan/test/8addr0x804851e*/

/*file/usr/home/shieyuan/test/8addr0x804851e*/

}/*0x8048520*/

intxx/*0x8049628*/;

intyy/*0x804962c*/;

动态重定位表

•DYNAMICRELOCATIONRECORDS

•OFFSETTYPEVALUE

•08049590R_386_JUMP_SLOTprintf

•08049594R_386_JUMP_SLOTatexit

•08049598R_386_JUMP_SLOTexit

更多推荐

0x000000f4