插件python分析oat文件android foramte筆記_第1頁(yè)
插件python分析oat文件android foramte筆記_第2頁(yè)
插件python分析oat文件android foramte筆記_第3頁(yè)
插件python分析oat文件android foramte筆記_第4頁(yè)
插件python分析oat文件android foramte筆記_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Android Oat 文件格式分析筆記ManyFace2015.12.2目錄1 Elf Header4e_type 取值4e_machine 取值4文件中 Elf header 分析5program header table6p_type 取值6p_flags 取值7文件中 program header table 分析83 section header table9sh_type 取值10sh_flag 取值13文件中 section header table 分析15第零個(gè) section header15第一個(gè) section header16第二個(gè) section header19第

2、三個(gè) section header20第四個(gè) section header20第五個(gè) section header21第六個(gè) section header21第七個(gè) section header22Oatdata 段23OatHeader24文件中oatHeader 分析27Dex Meta Data28文件中 Dex Meta Data 分析294.5 OatClass304.5.1 文件中分析 OatClass335 總結(jié)35參考: and Linkable Formathttp/5.1.1 r6/最近分析了 Oat 文件格式,基于 Android5.1.1、32 位,現(xiàn)把分析筆記與大家共

3、享。由于能力有限,筆記中不對(duì)的地方,還請(qǐng)各位大神指正。本次分析基于一個(gè)從Nexus6 中拷貝出來(lái)的真實(shí)oat 文件。以該文件為樣本,逐步分析,達(dá)到深入理解的效果。大家在看本文時(shí),可以結(jié)合附件中的圖和 oat文件(demo.oat)。下面進(jìn)入正題。Oat 文件其實(shí)就是類(lèi)型為 shared object 的 Elf 文件,因而具有 elf 文件的外殼,圖 1 是來(lái)自的 Elf 文件結(jié)構(gòu)圖。在 Oat 文件中,有兩個(gè)特殊的段:oatdata段和 oatexec 段,其實(shí)就是圖 1 中的.rodata 和.text。oatdata 段包含與原始 dex 文件相關(guān)的信息,oatexec的是方法的 nat

4、ive code。Program header table 中的信息用于告訴操作系統(tǒng)如何加載該文件,section header table 中的信息主要用于階段。因而,本次分析從 Elf 文件格式開(kāi)始分析,再深入分析 Oatdata 段。圖 1 Elf 文件格式1 Elf Header/art/runtime/elf.hElf32_Ehdr34h bytes1.1 e_type 取值1.2 e_machine 取值(0028h 表示是 arm)132/ Machine architectures 133enum 134 115/ File types 116enum ET_NONE= 0,/

5、 No file typeET_REL= 1,/ Relocatable fileET_EXEC= 2,/ Executable fileET_DYN= 3,/ Shared object fileET_CORE= 4,/ Core fileET_LOPROC = 0 xff00, / Beginning of prosor-specific codesET_HIPROC = 0 xf / Prosor-specific124;69strucf32_Ehdr unsigned char e_identEI_NIDENT; / ELF Identification bytesElf32_Half

6、e_type;/ Type of file (see ET_* below)Elf32_Halfe_machine;/ Required architecture for this file (see EM_*)Elf32_Worde_ver;/ Must be equal to 1Elf32_Addre_entry;/ Address to jump to in order to start programElf32_Offe_phoff;/ Program header tables file offset, in bytesElf32_Offe_shoff;/ Section heade

7、r tables file offset, in bytesElf32_Worde_flags;/ Prosor-specific flagsElf32_Halfe_ehsize;/ Size of ELF header, in bytesElf32_Halfe_phentsize; / Size of an entryhe program header tableElf32_Halfe_phnum;/ Number of entrieshe program header tableElf32_Halfe_shentsize; / Size of an entryhe section head

8、er tableElf32_Halfe_shnum;/ Number of entrieshe section header tableElf32_Halfe_shstrndx; / Sect hdr table index of sect name string tablebool check() const return (memcmp(e_ident, Elf, strlen(Elf) = 0;86 unsigned char getFileClass() const return e_identEI_CLASS; unsigned char getDataEncoding() cons

9、t return e_identEI_DATA; 891.3 文件中 Elf header 分析由上可知,該 elf 類(lèi)型是共享目標(biāo)文件。Elf header 的字節(jié)數(shù)為 e_ehsize 34h bytes。Program header table 開(kāi)始地址是 e_phoff 34h,table 中每一條的字節(jié)數(shù)是 e_phentsize 20h bytes條數(shù)為 e_phnum 5h。因而 Program header table的字節(jié)數(shù)是 20h*5h=A0h bytes,在文件中的范圍34 h, D3 h。Section header table 開(kāi)始地址是 e_shoff 12B07

10、0h,table 中每一條的字節(jié)數(shù)是 e_shentsize 28h bytes,條數(shù)為 e_shnum 8h。因而 Section headertable 的字節(jié)數(shù)是 28h*8h=140h bytes,在文件中的范圍12B070 h, 12B1AF h。Section names string table 在 section header table 中的索引是 e_shstrndx 7,也就是說(shuō) section header table 中的第 8 條是關(guān)于 Section names stringtable 的相關(guān)信息。Section names string table 中存著每個(gè)

11、sectioin 的名字。字段值地址unsigned char e_ident16該字段不用轉(zhuǎn)字節(jié)序7F454C46 (umber) 01 (32 or 64)01 (little or big endianness) 01 (Ver)03 (OSabi)00 (abiVer)00000000000000 (pad)0e_type (2b)0003 (共享目標(biāo)文件)10e_machine (2b)002812e_ver(4b)0000000114e_entry (4b)0000000018e_phoff (4b)000000341Ce_shoff (4b)0012B07020e_flags (

12、4b)0500000024e_ehsize(2b)003428e_phentsize(2b)00202Ae_phnum(2b)00052Ce_shentsize(2b)00282Ee_shnum(2b)000830e_shstrndx(2b)000732157 EM_ARM= 40, / ARM158 297;2 program header tabletable 中每條的數(shù)據(jù)結(jié)構(gòu):/art/runtime/elf.hElf32_Phdr20h bytesp_type 表示段的類(lèi)型p_offset 表示該段相對(duì)于文件開(kāi)始的偏移p_vaddr 表示該段在內(nèi)存中的首字節(jié)地址(即虛擬地址)p_pad

13、dr:在物理地址定位有關(guān)的系統(tǒng)中,該字段是為該段的物理地址而保留的,對(duì)于可執(zhí)行文件和共享的 object 而言是未指定內(nèi)容的。p_filesz 表示在文件映像中該段的字節(jié)數(shù)(可能是 0) p_memsz 表示在內(nèi)存映像中該段的字節(jié)數(shù)(可能是 0) p_flags:該段的相關(guān)標(biāo)志p_align:可載入的進(jìn)程段必須有合適的 p_vaddr 、 p_offset 值,取頁(yè)面大小的模。該字段給出了該段在內(nèi)存和文件中排列值。 0 和 1 表示不需要排列。否則,p_align 必須為正的 2 的冪。2.1 p_type 取值1575/ Segment types. 1576enum 1577 PT_NUL

14、L= 0, / Unused segment.1578 PT_LOAD= 1, / Loadable segment.1579 PT_DYNAMIC = 2, / Dynamic linking information. 1580 PT= 3, /retathname.1581 PT_NOTE= 4, / Auxiliary information. 1582 PT_SHLIB = 5, /.1551/ Program header for ELF32. 1552strucf32_Phdr 1553 Elf32_Word p_type;/ Type of segment1554 Elf32_O

15、ffp_offset; / File offset where segment is located, in bytes 1555 Elf32_Addr p_vaddr; / Virtual address of beginning of segment1556 Elf32_Addr p_paddr; / Physical address of beginning of segment (OS-specific)1557 Elf32_Word p_filesz; / Num. of bytes in file image of segment (may be zero)1558 Elf32_W

16、ord p_memsz; / Num. of bytesem image of segment (may bezero)1559 Elf32_Word p_flags; / Segment flags1560 Elf32_Word p_align; / Segment alignment constra1561;2.2 p_flags 取值1611/ Segment flag bits. 1612enum : unsigned 1613 PF_X= 1,/ Execute1614 PF_W= 2,/ Write1615 PF_R= 4,/ Read1616 PF_MASKOS= 0 x0ff0

17、0000,/ Bits for operating system-specific sems. 1617 PF_MASKPROC = 0 xf0000000 / Bits for prosor-specific sems.1618;1583 PT_PHDR= 6, / The program header table itself. 1584 PT_TLS= 7, / The thread-local storage template.1585 PT_LOOS= 0 x60000000, / Lowest operating system-specific pt entrytype.1586

18、PT_HIOS= 0 x6f, / Highest operating system-specific pt entry type.1587 PT_LOPROC= 0 x70000000, / Lowest prosor-specific program hdr entry type.1588 PT_HIPROC= 0 x7f, / Highest prosor-specific program hdr entry type.15891590 / x86-64 program header types.1591 / These all contain stacktables. 1592 PT_

19、GNU_EH_FRAME= 0 x6474e550,1593 PT_SUNW_EH_FRAME = 0 x6474e550,1594 PT_SUNW= 0 x6464e550,15951596 PT_GNU_STACK= 0 x6474e551, / Indicates stack executability. 1597 PT_GNU_RELRO= 0 x6474e552, / Read-only after relocation.15981599 / ARM program header types.1600 PT_ARM_ARCHEXT = 0 x70000000, / Platform

20、architecture compatibility info 1601 / These all contain stacktables.1602 PT_ARM_EXIDX= 0 x70000001,1603 PT_ARM= 0 x70000001,16041605 / MIPS program header types.1606 PT_MIPS_REGINFO= 0 x70000000, / Register usage information. 1607 PT_MIPS_RTPROC= 0 x70000001, / Runtime procedure table.1608 PT_MIPS_

21、OPTIONS= 0 x70000002/ Options segment.1609;2.3 文件中 program header table 分析從上面的分析可以知道,該 table 開(kāi)始地址是 34h,字節(jié)數(shù)為 A0h bytes,共有 5 個(gè)元素,分別如下:(段的地址范圍p_offset, p_offset+p_filesz-1)從 p_type 可知,第一個(gè)元素描述的段是 program header table。字段值地址范圍2p_type (4b)00000001(Loadable segment)7474,93p_offset (4b)000B500078p_vaddr (4b)

22、000B50007Cp_paddr (4b)000B500080p_filesz (4b)00075FE884字段值地址范圍1p_type (4b)00000001(Loadable segment)5454,73p_offset (4b)0000000058p_vaddr (4b)000000005Cp_paddr (4b)0000000050p_filesz (4b)000B500064p_memsz (4b)000B500068p_flags (4b)00000004 (只讀)6Cp_align (4b)0000100070該元素所指向的段的地址范圍0, B4字段值地址范圍0p_type

23、 (4b)000000063434,53p_offset (4b)0000003438p_vaddr (4b)000000343Cp_paddr (4b)0000003440p_filesz (4b)000000A044p_memsz (4b)000000A048p_flags (4b)00000004 (只讀)4Cp_align (4b)0000000450該元素所指向的段的地址范圍34, D33 section header tabletable 中每條的數(shù)據(jù)結(jié)構(gòu):/art/runtime/elf.hElf32_Shdr28h bytes1203/ Section header. 1204

24、strucf32_Shdr 1205 Elf32_Word sh_name;/ Section name (indexo string table)字段值地址范圍4p_type (4b)00000002(Dynamic segment)B4B4,D3p_offset (4b)0012B000B8p_vaddr (4b)0012B000BCp_paddr (4b)0012B000C0p_filesz (4b)00000038C4p_memsz (4b)00000038C8p_flags (4b)00000006(可讀可寫(xiě))CCp_align (4b)00001000D0該元素所指向的段的地址范圍

25、12B000, 12B037字段值地址范圍3p_type (4b)00000001(Loadable segment)9494,B3p_offset (4b)0012B00098p_vaddr (4b)0012B0009Cp_paddr (4b)0012B000A0p_filesz (4b)00000038A4p_memsz (4b)00000038A8p_flags (4b)00000006(可讀可寫(xiě))ACp_align (4b)00001000B0該元素所指向的段的地址范圍12B000, 12B037p_memsz (4b)00075FE888p_flags (4b)00000005(可讀

26、可執(zhí)行)8Cp_align (4b)0000100090該元素所指向的段的地址范圍B5000, 12AFE7sh_name:該字段表示 Section 的名字,是 string table 的索引,通過(guò) string table 找到具體的字符串。sh_type:Section 的類(lèi)型。sh_flags:section 支持位的標(biāo)記,多個(gè)屬性。sh_addr:假如該 section 將出現(xiàn)在進(jìn)程的內(nèi)存映像空間里,該字段表示該section 在內(nèi)存中的位置。否則,該字段為 0。sh_offset:該 section 在文件中的偏移。SHT_NOBITS 類(lèi)型的 section 在文件中不占空間,

27、它的 sh_offset 定位在文件中的概念上的位置。sh_size:表示 section 字節(jié)大小。類(lèi)型為 SHT_NOBITS 的 section 的 sh_size 可能為非 0 大小,但是不占文件空間。sh_link:該成員保存了一個(gè) section 報(bào)頭表的索引連接,它的解釋依靠該section 的類(lèi)型。sh_info:額外信息,它的解釋依靠該 section 的類(lèi)型。sh_addralign:一些 sections 有地址對(duì)齊的約束。例如,假如一個(gè) section 保存著雙字,系統(tǒng)就必須確定整個(gè) section 是否雙字對(duì)齊。所以 sh_addr 的值以 sh_addralign

28、的值作模,那么一定為 0。當(dāng)然的,僅僅 0 和正的 2 的次方是允許的。值 0 和 1 意味著該 section 沒(méi)有對(duì)齊要求。sh_entsize:一些 sections 保存著一張固定大小 的表,就像符號(hào)表。對(duì)于這樣一個(gè) section 來(lái)說(shuō),該字段給出了每個(gè)的字節(jié)大小。如果該 section沒(méi)有保存著一張固定大小的表,該成員就為 0。3.1 sh_type 取值1245/ Section types. 1246enum : unsigned 1206 Elf32_Word sh_type; / Section type (SHT_*) 1207 Elf32_Word sh_flags;

29、/ Section flags (SHF_*)1208 Elf32_Addr sh_addr; / Address where section is to be loaded 1209 Elf32_Off sh_offset; / File offset of section data, in bytes 1210 Elf32_Word sh_size; / Size of section, in bytes1211 Elf32_Word sh_link;/ Section type-specific header table index link 1212 Elf32_Word sh_inf

30、o;/ Section type-specific extra information1213 Elf32_Word sh_addralign; / Section address alignment1214 Elf32_Word sh_entsize;/ Size of records contained withhe section1215;124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712

31、78127912801281SHT_NULL SHT_PROGBITS SHT_SYMTAB SHT_STRTAB SHT_RELA SHT_HASH SHT_DYNAMIC SHT_NOTE SHT_NOBITS SHT_REL SHT_SHLIB SHT_DYNSYM SHT_INIT_ARRAY SHT_FINI_ARRAYSHT_PREINIT_ARRAY SHT_GROUP SHT_SYMTAB_SHNDXSHT_LOOS=0,1,2,3,4,5,6,7,8,9,10,11,14,15,16,17,18,/No assoted section (inactive entry).Pro

32、gram-defined contents. Symbol table.String table.Relocation entries; explicit addends.Symbol hashInformation Informationtable.for dynamic linking. about the file.Data occupies no spacehe file.Relocation entries; no explicit addends.Symbol table.Po PoPoers ersersto totoinitialization functions. termi

33、nation functions.pre-init functions.SectionIndigroup.for SHN_XINDEX entries.Lowest operating system-specific0 x60000000, /type.SHT_GNU_ATTRIBUTES=0 x6 0 x6 0 x6 0 x6 0 x60 x65, /6, / d, / e, / f, /f, /Objectributes.SHT_GNU_HASHSHT_GNU_verdef SHT_GNU_verneed SHT_GNU_versym SHT_HIOSSHT_LOPROC=GNU-styl

34、ehash table.definitions.GNUGNU GNUververreferen.symbol vers table.Highest operating system-specific type.0 x70000000, /Lowest prosor arch-specific type./ Fixme: All this is duplicated/ Exception Index tableCSectionELF. Why?SHT_ARM_EXIDX/ BPABI DLL dynamic SHT_ARM_PREEMPTMAP= 0 x70000001U,linking pre

35、-emption map= 0 x70000002U,/ Object file compatibility attributesSHT_ARM_ATTRIBUTES= 0 x70000003U,= 0 x70000004U,= 0 x70000005U,= 0 x70000000, / Link editor is to sort theSHT_ARM_DEBUERLAYSHT_ARM_OVERLAYSECTIONSHT_HEX_ORDEREDentries in1282/ this section based on their sizes12831284128512861287128812

36、89SHT_X86_64_= 0 x70000001, /informationSHT_MIPS_REGINFOSHT_MIPS_OPTIONS= 0 x70000006, / Register usage information= 0 x7000000d, / General optionsSHT_HIPROCSHT_LOUSER= 0 x7f, / Highest prosor arch-specific type.for applications.= 0 x80000000, / Lowest typeSHT_NULL:該值表示該 section 頭是無(wú)效的,它沒(méi)有相關(guān)的 section

37、,該 section的其他成員的值都是未定義的。SHT_PROGBITS:該 section 保存被程序定義了的一些信息,它的格式和意義取決于程序本身。SHT_SYMTAB and SHT_DYNSYM:該 section 保存著一個(gè)符號(hào)表(symbol table)。 SHT_STRTAB:該 section 保存著一個(gè)字符串表。一個(gè) object 文件可以包含多個(gè)字符串表的 section。SHT_RELA:該 section 保存著具有明確加數(shù)的重定位。就象 object 文件32 位的 Elf32_Rela 類(lèi)型。一個(gè) object 文件可能有多個(gè)重定位的 sections。 SHT_

38、HASH:該標(biāo)號(hào)保存著一個(gè)標(biāo)號(hào)的哈希(hash)表。所有的參與動(dòng)態(tài)連接的 object 一定包含了一個(gè)標(biāo)號(hào)哈希表(hash table)。當(dāng)前的,一個(gè) object 文件可能只有一個(gè)哈希表。SHT_DYNAMIC:該 section 保存著動(dòng)態(tài)連接的信息。當(dāng)前的,一個(gè) object 文件可能只有一個(gè)動(dòng)態(tài)的 section。SHT_NOTE:該 section 保存著其他的一些標(biāo)志文件的信息。SHT_NOBITS:該類(lèi)型的 section 在文件中不占空間,但是類(lèi)似 SHT_PROGBITS。盡管該 section 不包含字節(jié),sh_offset 成員包含了概念上的文件偏移量。SHT_REL 該

39、 section 保存著具有明確加數(shù)的重定位的。就象 object 文件32 位類(lèi)型 Elf32_Rel 類(lèi)型。一個(gè) object 文件可能有多個(gè)重定位的 sections。 SHT_SHLIB:該 section 類(lèi)型保留但語(yǔ)意沒(méi)有指明。包含這個(gè)類(lèi)型的 section 的程序是不符合 ABI 的。SHT_LOPROC through SHT_HIPROC:在這范圍之間的值為特定處理器語(yǔ)意保留的。SHT_LOUSER:該變量為應(yīng)用程序保留的索引范圍的最小邊界。 SHT_HIUSER:該變量為應(yīng)用程序保留的索引范圍的最大邊界。在 SHT_LOUSER和 HIUSER 的 section 類(lèi)型可能

40、被應(yīng)用程序使用,這和當(dāng)前或者將來(lái)系統(tǒng)定義的 section 類(lèi)型是不的。1290 SHT_HIUSER= 0 xff / Highest typefor applications. 1291;3.2 sh_flag 取值1293/ Section flags. 1294enum : unsigned 1295 / Section data should be writable during execution. 1296 SHF_WRITE = 0 x1,12971298 / Section occupies memory during program execution. 1299 SHF_

41、ALLOC = 0 x2,13001301 / Section contains executable machine instructions. 1302 SHF_EXECINSTR = 0 x4,13031304 / The datahis section may be merged. 1305 SHF_MERGE = 0 x10,13061307 / The datahis section is null-terminated strings. 1308 SHF_STRINGS = 0 x20,13091310 / A fieldhis section holds a section h

42、eader table index. 1311 SHF_INFO_LINK = 0 x40U,13121313 / Adds spel ordering requirements for link editors. 1314 SHF_LINK_ORDER = 0 x80U,13151316 / This section requires spel OS-specific prosing to avoid incorrect 1317 / behavior.1318 SHF_OS_NONCONFORMING = 0 x100U,13191320 / This section is a membe

43、r of a section group. 1321 SHF_GROUP = 0 x200U,13221323 / This section holds Thread-Local Storage. 1324 SHF_TLS = 0 x400U,13251326 / This section is excluded from the final executable or shared library. 1327 SHF_EXCLUDE = 0 x80000000U,13281329 / Start of-specific flags. 13301331 /_SHF_CP_SECTION - A

44、ll sections with the c flag are grouped 1332 / together by the linker to form the constant pool and the cp register is1333 / set to the start of the constant pool by the boot code.1334133513361337133813391340134113421343134413451346hold 1347code 1348them. 1349t 1350does 1351in a 13521353135413551356

45、135713581359136013611362136313641365136613671368136913701371_SHF_CP_SECTION = 0 x800U,/_SHF_DP_SECTION - All sections with the d flag are grouped/ together by the linker to form the data section and the dp register is/ set to the start of the section by the boot code._SHF_DP_SECTION = 0 x1000U,SHF_M

46、ASKOS= 0 x0ff00000,/ Bits indicating prosor-specific flags.SHF_MASKPROC = 0 xf0000000,/If an object file section does nove this flag set, then it may not/moren 2GB and can be freely referred to in objects using smaller/ms. Otherwise, only objects using larger code ms can refer to/For exle, a medium

47、code mobject can refer to data in a section/sets this flag besides being able to refer to data in a sectiont/not set it; likewise, a small code mobject can refer only to code/sectiont does not set this flag.SHF_X86_64_LARGE = 0 x10000000,/ All sections with the GPREL flag are groupedo a global data

48、area/ for faster acsesSHF_HEX_GPREL = 0 x10000000,/ Section contains text/data whiay be replicated in other sections./ Linker must retain only one copy. SHF_MIPS_NODUPES = 0 x01000000,/ Linker must generate implicit hidden weak names.SHF_MIPS_NAMES= 0 x02000000,/ Section data local to proSHF_MIPS_LO

49、CAL= 0 x04000000,s./ Do not strip this section.SHF_MIPS_NOSTRIP = 0 x08000000,3.3 文件中 section header table 分析從 Elf Header 的分析可以知道,該 table 的開(kāi)始地址是 12B070h,table 中每一條的字節(jié)數(shù)是 28h bytes,section header 數(shù)目為 8h,Section header table的字節(jié)數(shù)是 28h*8h=140h bytes,在文件中的范圍12B070 h, 12B1AF h。Section names string table 在

50、section header table 中的索引是 7。8 個(gè) section header 分別如下。(section 的地址范圍sh_offset, sh_offset+sh_size-1)3.3.1 第零個(gè) section header由于該 section header 的 sh_type 是 0(SHT_NULL),因而無(wú)效,沒(méi)有定義。字段值地址范圍0sh_name (4b)00000000 (NULL)12B07012B070, 12B097sh_type(4b)00000000-SHT_NULL-無(wú)效12B074sh_flags (4b)0000000012B078sh_add

51、r (4b)0000000012B07Csh_offset(4b)0000000012B080sh_size (4b)0000000012B084sh_link (4b)0000000012B088sh_info (4b)0000000012B08Csh_addralign(4b)0000000012B090sh_entsize(4b)0000000012B094該元素所指向的 section 的地址范圍1372 / Section must be part of global data area. 1373 SHF_MIPS_GPREL= 0 x10000000,13741375 / Thi

52、s section should be merged. 1376 SHF_MIPS_MERGE= 0 x20000000,13771378 / Address size to be inferred from section entry size. 1379 SHF_MIPS_ADDR= 0 x40000000,13801381 / Section data is string data by default. 1382 SHF_MIPS_STRING = 0 x800000001383;3.3.2 第一個(gè) section header sysmbol tablesymbol table 符號(hào)

53、表:一個(gè) object 文件的符號(hào)表保存了一個(gè)程序在定位和重定位時(shí)需要的定義和的信息。一個(gè)符號(hào)表索引是相應(yīng)的下標(biāo)。0 表項(xiàng)特指了該表的第一個(gè)。sysmbol table 的 entry 結(jié)構(gòu)如下:/art/runtime/elf.hElf32_Sym10h bytes1392/ Symbol table entries for ELF32. 1393strucf32_Sym 1394 Elf32_Wordst_name; / Symbol name (indexo string table)1395 Elf32_Addrst_value; / Value or address assoted

54、with the symbol 1396 Elf32_Wordst_size; / Size of the symbol1397 unsigned char st_info; / Symbols type and binding attributes 1398 unsigned char st_other; / Must be zero;1399 Elf32_Halfst_shndx; / Which section (header table index) its definedin1401 / These acsors and muors correspond to the ELF32_S

55、T_BIND, 1402 / ELF32_ST_TYPE, and ELF32_ST_INFO macros definedhe ELF specification:1403 unsigned char getBinding() const return st_info 4; 1404 unsigned char getType() const return st_info & 0 x0f; 1405 void setBinding(unsigned char b) setBindingAndType(b, getType(); 1406 void setType(unsigned char

56、t) setBindingAndType(getBinding(), t); 字段值地址范圍1sh_name (4b)00000001 (.dynsym)12B09812B098, 12B0BFsh_type(4b)0000000B(SHT_DYNSYM : symbol table)12B09Csh_flags (4b)00000002 (SHF_ALLOC)12B0A0sh_addr (4b)000000D412B0A4sh_offset(4b)000000D412B0A8sh_size (4b)0000004012B0ACsh_link (4b)0000000212B0B0sh_info

57、 (4b)0000000012B0B4sh_addralign(4b)0000000412B0B8sh_entsize(4b)0000001012B0BC該元素所指向的 section 的地址范圍D4, 113st_name:該字段保存了該 object 文件的符號(hào)在 string table 中的索引。如果該值不為 0 ,則它代表了給出符號(hào)名的 string table 索引。否則,該符號(hào)無(wú)名。st_value:該成員給出了相應(yīng)的符號(hào)值。它可能是絕對(duì)值或地址等等(依賴于上下文);st_size:符號(hào)的大小。比如,一個(gè)數(shù)據(jù)對(duì)象的大小是該對(duì)象所包含的字節(jié)數(shù)目。如果該符號(hào)的大小未知或沒(méi)有大小則這個(gè)

58、成員為0 。st_info:成員了符號(hào)的類(lèi)型和相應(yīng)的屬性。st_other:該成員目前為 0 ,沒(méi)有含義。st_shndx:每一個(gè)符號(hào)表的都定義為和某些section 相關(guān);該字段保存symbol 所指向的段的偏移了相關(guān) section header 的索引。由此到該=section_header_tableElf32_Sym. st_shndx. sh_offset+ Elf32_Sym. st_value-section_header_tableElf32_Sym. st_shndx. sh_addr 文件中 sysmbol table 分析該 section header 所指向的 se

59、ction 為 sysmbol table,section 的開(kāi)始地址為 sh_offset D4h,字節(jié)數(shù)為 sh_size 40h bytes,地址范圍為D4 h, 113 h,由于 sysmbol table 的一條 entry 的字節(jié)數(shù)為 10h bytes(可以從 section header 的 sh_entsize 得出,也可以直接從 Elf32_Sym 結(jié)構(gòu)體的字節(jié)數(shù)得出),所以該 table 有 4 條 entry,分別如下(string table 是第二個(gè) section header 所描述的 section,以 st_name 為索引在 string table 中查

60、找對(duì)應(yīng)的 sysmbol 名字):索引字段值地址范圍0st_name (4b)00 00 00 00(0-無(wú)效的符號(hào))D4D4, E3st_value(4b)00 00 00 00D8st_size(4b)00 00 00 00DCst_info (1b)00E0st_other(1b)00E11407 void setBindingAndType(unsigned char b, unsigned char t) 1408st_info = (b dex_file_count_*(4+dex_file_location_size+4+4+4*dex-class_defs_size_)=oat

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論