藿香正气 发表于 2017-5-11 15:01

ELF文件格式学习,ELF section修复

本帖最后由 藿香正气 于 2018-5-14 10:48 编辑

0x0001
学习Android逆向也有一段时间,翻看大神们的帖子收获了不少,开始对ELF、so文件很感兴趣,尤其对内存dump和修复的技术很好奇,看了ThomasKing的ELF section修复的帖子更是深受启发,链接:http://www.52pojie.cn/thread-294642-1-1.html,通过帖子中给出的修复思路,再配合一篇关于ELF文件结构解析的文章让小弟完整立体的了解ELF的文件结构和加载运行等机制,出于好奇想知道这个SECTION的修复具体的实现,但是大神没有给出源码,在网上搜索也没有人在这方面提供资料,因此就决定通过这篇帖子给出的思路,自己实现一个section修复工具,顺便也学习一下elf文件
0x0002
其实TomasKing的帖子中已经把思路都写得很清楚了,但在实现时确实有一些坑,当时天真的认为shstrtab这个section会在dump下的文件中找到,结果发现根本没有,这里需要自己写一个shstrtab然后添加在section header 尾部,还有一个问题就是大神说道”通过__global_offset_table 偏移 + 4 * (rel.plt.size) / sizeof(Elf32_Rel)(这里还需要添加2个int的填充位置)得到got的末尾“ 实际是添加了3个int的填充位,这里不知道大神写错了还是程序之间的差异。下面就给我源码吧 代码比较挫看的时候大家忍一忍 有不对的地方请大家斧正

#define _CRT_SECURE_NO_WARNINGS
#include "fix.h"

char* str = "..dynsym..dynstr..hash..rel.dyn..rel.plt..plt..text@.ARM.extab..ARM.exidx..fini_array..init_array..dynamic..got..data..bss..shstrtab\0";
char* str1 = "\0.dynsym\0.dynstr\0.hash\0.rel.dyn\0.rel.plt\0.plt\0.text@.ARM.extab\0.ARM.exidx\0.fini_array\0.init_array\0.dynamic\0.got\0.data\0.bss\0.shstrtab\0";
Elf32_Shdr shdr = { 0 };

void get_elf_header(char* buffer,Elf32_Ehdr** pehdr)
{
      int header_len = sizeof(Elf32_Ehdr);
      memset(*pehdr, 0, header_len);
      memcpy(*pehdr, (void*)buffer, header_len);
}

void get_program_table(Elf32_Ehdr ehdr,char* buffer,Elf32_Phdr** pphdr)
{
      int ph_size = ehdr.e_phentsize;
      int ph_num = ehdr.e_phnum;
      memset(*pphdr, 0, ph_size * ph_num);
      memcpy(*pphdr, buffer + ehdr.e_phoff,ph_size * ph_num);
}

long get_file_len(FILE* p)
{
    fseek (p, 0, SEEK_END);
    long fsize = ftell (p);
    rewind (p);
    return fsize;
}


void get_Info(Elf32_Phdr* phdr, Elf32_Ehdr *pehdr, char* buffer)
{
      Elf32_Dyn* dyn = NULL;
      Elf32_Dyn* d = NULL;
      Elf32_Phdr load = { 0 };
      
      int ph_num = pehdr->e_phnum;
      int dyn_size = 0, dyn_off = 0;
      int nbucket = 0, nchain = 0;
      int flag = 0, i = 0;

      for(;i < ph_num;i++) {
                if (phdr.p_type == PT_LOAD) {
                        if (phdr.p_vaddr > 0x0) {
                              load = phdr;
                              shdr.sh_name = strstr(str,".bss") - str;
                              shdr.sh_type = SHT_NOBITS;
                              shdr.sh_flags = SHF_WRITE | SHF_ALLOC;
                              shdr.sh_addr =phdr.p_vaddr + phdr.p_filesz;
                              shdr.sh_offset = shdr.sh_addr - 0x1000;
                              shdr.sh_addralign = 1;

                              continue;
                        }
                }

                if(phdr.p_type == PT_DYNAMIC) {
                        shdr.sh_name = strstr(str, ".dynamic") - str;
                        shdr.sh_type = SHT_DYNAMIC;
                        shdr.sh_flags = SHF_WRITE | SHF_ALLOC;
                        shdr.sh_addr = phdr.p_vaddr;
                        shdr.sh_offset = phdr.p_offset;
                        shdr.sh_size = phdr.p_filesz;
                        shdr.sh_link = 2;
                        shdr.sh_info = 0;
                        shdr.sh_addralign = 4;
                        shdr.sh_entsize = 8;
                        dyn_size = phdr.p_filesz;
                  dyn_off = phdr.p_offset;
                  continue;
                }

                if(phdr.p_type == PT_LOPROC || phdr.p_type == PT_LOPROC + 1) {
                        shdr.sh_name = strstr(str, ".ARM.exidx") - str;
                        shdr.sh_type = SHT_LOPROC;
                        shdr.sh_flags = SHF_ALLOC;
                        shdr.sh_addr = phdr.p_vaddr;
                        shdr.sh_offset = phdr.p_offset;
                        shdr.sh_size = phdr.p_filesz;
                        shdr.sh_link = 7;
                        shdr.sh_info = 0;
                        shdr.sh_addralign = 4;
                        shdr.sh_entsize = 8;
                        continue;
                }
      }

      dyn = (Elf32_Dyn*)malloc(dyn_size);
      memcpy(dyn,buffer+dyn_off,dyn_size);
      i = 0;
      for (; i < dyn_size / sizeof(Elf32_Dyn); i++) {
                switch (dyn.d_tag) {
                        case DT_SYMTAB:
                              shdr.sh_name = strstr(str, ".dynsym") - str;
                              shdr.sh_type = SHT_DYNSYM;
                              shdr.sh_flags = SHF_ALLOC;
                              shdr.sh_addr = dyn.d_un.d_ptr;
                              shdr.sh_offset = dyn.d_un.d_ptr;
                              shdr.sh_link = 2;
                              shdr.sh_info = 1;
                              shdr.sh_addralign = 4;
                              shdr.sh_entsize = 16;
                              break;

                        case DT_STRTAB:
                              shdr.sh_name = strstr(str, ".dynstr") - str;
                              shdr.sh_type = SHT_STRTAB;
                              shdr.sh_flags = SHF_ALLOC;
                              shdr.sh_offset = dyn.d_un.d_ptr;
                              shdr.sh_addr = dyn.d_un.d_ptr;
                              shdr.sh_addralign = 1;
                              shdr.sh_entsize = 0;
                              break;

                        case DT_HASH:
                              shdr.sh_name = strstr(str, ".hash") - str;
                              shdr.sh_type = SHT_HASH;
                              shdr.sh_flags = SHF_ALLOC;
                              shdr.sh_addr = dyn.d_un.d_ptr;
                              shdr.sh_offset = dyn.d_un.d_ptr;
                              memcpy(&nbucket, buffer + shdr.sh_offset, 4);
                              memcpy(&nchain, buffer + shdr.sh_offset + 4, 4);
                              shdr.sh_size = (nbucket + nchain + 2) * sizeof(int);
                              shdr.sh_link = 4;
                              shdr.sh_info = 1;
                              shdr.sh_addralign = 4;
                              shdr.sh_entsize = 4;
                              break;

                        case DT_REL:
                              shdr.sh_name = strstr(str, ".rel.dyn") - str;
                              shdr.sh_type = SHT_REL;
                              shdr.sh_flags = SHF_ALLOC;
                              shdr.sh_addr = dyn.d_un.d_ptr;
                              shdr.sh_offset = dyn.d_un.d_ptr;
                              shdr.sh_link = 4;
                              shdr.sh_info = 0;
                              shdr.sh_addralign = 4;
                              shdr.sh_entsize = 8;
                              break;

                        case DT_JMPREL:
                              shdr.sh_name = strstr(str, ".rel.plt") - str;
                              shdr.sh_type = SHT_REL;
                              shdr.sh_flags = SHF_ALLOC;
                              shdr.sh_addr = dyn.d_un.d_ptr;
                              shdr.sh_offset = dyn.d_un.d_ptr;
                              shdr.sh_link = 1;
                              shdr.sh_info = 6;
                              shdr.sh_addralign = 4;
                              shdr.sh_entsize = 8;
                              break;

                        case DT_PLTRELSZ:
                              shdr.sh_size = dyn.d_un.d_val;
                              break;

                        case DT_FINI:
                              shdr.sh_name = strstr(str, ".fini_array") - str;
                              shdr.sh_type = 15;
                              shdr.sh_flags = SHF_WRITE | SHF_ALLOC;
                              shdr.sh_offset = dyn.d_un.d_ptr - 0x1000;
                              shdr.sh_addr = dyn.d_un.d_ptr;
                              shdr.sh_addralign = 4;
                              shdr.sh_entsize = 0;
                              break;

                        case DT_INIT:
                              shdr.sh_name = strstr(str, ".init_array") - str;
                              shdr.sh_type = 14;
                              shdr.sh_flags = SHF_WRITE | SHF_ALLOC;
                              shdr.sh_offset = dyn.d_un.d_ptr - 0x1000;
                              shdr.sh_addr = dyn.d_un.d_ptr;
                              shdr.sh_addralign = 4;
                              shdr.sh_entsize = 0;
                              break;

                        case DT_RELSZ:
                              shdr.sh_size = dyn.d_un.d_val;
                              break;
                        
                        case DT_STRSZ:
                              shdr.sh_size = dyn.d_un.d_val;
                              break;

                        case DT_PLTGOT:
                              shdr.sh_name = strstr(str, ".got") - str;
                              shdr.sh_type = SHT_PROGBITS;
                              shdr.sh_flags = SHF_WRITE | SHF_ALLOC;
                              shdr.sh_addr = shdr.sh_addr + shdr.sh_size;
                              shdr.sh_offset = shdr.sh_addr - 0x1000;
                              shdr.sh_size = dyn.d_un.d_ptr;
                              shdr.sh_addralign = 4;
                              break;
                }
      }
      shdr.sh_size = shdr.sh_size + 4 * (shdr.sh_size) / sizeof(Elf32_Rel) + 3 * sizeof(int) - shdr.sh_addr;

      //STRTAB地址 - SYMTAB地址 = SYMTAB大小
      shdr.sh_size = shdr.sh_addr - shdr.sh_addr;

      shdr.sh_size = shdr.sh_addr - shdr.sh_addr;
      shdr.sh_size = shdr.sh_addr - shdr.sh_addr;
      
      shdr.sh_name = strstr(str, ".plt") - str;
      shdr.sh_type = SHT_PROGBITS;
      shdr.sh_flags = SHF_ALLOC | SHF_EXECINSTR;
      shdr.sh_addr = shdr.sh_addr + shdr.sh_size;
      shdr.sh_offset = shdr.sh_addr;
      shdr.sh_size = (20 + 12 * (shdr.sh_size) / sizeof(Elf32_Rel));
      shdr.sh_addralign = 4;

      shdr.sh_name = strstr(str, ".text") - str;
      shdr.sh_type = SHT_PROGBITS;
      shdr.sh_flags = SHF_ALLOC | SHF_EXECINSTR;
      shdr.sh_addr = shdr.sh_addr + shdr.sh_size;
      shdr.sh_offset = shdr.sh_addr;
      shdr.sh_size = shdr.sh_addr - shdr.sh_addr;
      
      shdr.sh_name = strstr(str, ".data") - str;
      shdr.sh_type = SHT_PROGBITS;
      shdr.sh_flags = SHF_WRITE | SHF_ALLOC;
      shdr.sh_addr = shdr.sh_addr + shdr.sh_size;
      shdr.sh_offset = shdr.sh_addr - 0x1000;
      shdr.sh_size = load.p_vaddr + load.p_filesz - shdr.sh_addr;
      shdr.sh_addralign = 4;
      shdr.sh_size = shdr.sh_offset - shdr.sh_offset;

      shdr.sh_name = strstr(str, ".shstrtab") - str;
      shdr.sh_type = SHT_STRTAB;
      shdr.sh_flags = SHT_NULL;
      shdr.sh_addr = 0;
      shdr.sh_offset = shdr.sh_addr - 0x1000;
      shdr.sh_size = strlen(str) + 1;
      shdr.sh_addralign = 1;
}

int main(int argc, char const *argv[])
{
      FILE* fr = NULL,* fw = NULL;
      long flen = 0,result = 0;
      char* buffer = NULL;
      Elf32_Ehdr *pehdr = NULL;
      Elf32_Phdr* pphdr = NULL;

      if (argc < 2) {
                printf("less args\n");
                return;
      }

      fr = fopen(argv,"rb");
      if(fr == NULL) {
                printf("Open failed: \n");
                goto error;
      }

      flen = get_file_len(fr);

      buffer = (char*)malloc(sizeof(char)*flen);
      if (buffer == NULL) {
                printf("Malloc error\n");
                goto error;
      }

      result = fread (buffer,1,flen,fr);
      if (result != flen) {
                printf("Reading error\n");
                goto error;
      }

      fw = fopen("fix.so","wb");
      if(fw == NULL) {
                printf("Open failed: fix.so\n");
                goto error;
      }
      
      pehdr = (Elf32_Ehdr*)malloc(sizeof(Elf32_Ehdr));
      get_elf_header(buffer, &pehdr);

      pphdr = (Elf32_Phdr*)malloc(pehdr->e_phentsize * pehdr->e_phnum);
      get_program_table(*pehdr, buffer, &pphdr);

      get_Info(pphdr, pehdr, buffer);
      
      pehdr->e_shnum = SHDRS;
      pehdr->e_shstrndx = SHDRS - 1;
      pehdr->e_shoff = shdr.sh_offset + strlen(str) + 1;
      memcpy(buffer, pehdr, sizeof(Elf32_Ehdr));
      memcpy(buffer + shdr.sh_offset, buffer + shdr.sh_offset + 0x1000, shdr.sh_size);
      //memset(buffer + shdr.sh_offset, 0, shdr.sh_offset);
      memcpy(buffer + shdr.sh_offset, str1, strlen(str) + 1);
      memcpy(buffer + pehdr->e_shoff, shdr, pehdr->e_shentsize * pehdr->e_shnum);
      flen = shdr.sh_offset + strlen(str) + 1 + SHDRS * sizeof(Elf32_Shdr);
      fwrite(buffer, sizeof(char)*flen, 1, fw);

error:
      if(fw != NULL)
                fclose(fw);
      if(fr != NULL)
                fclose(fr);
      if(buffer != NULL)
                free(buffer);
      return 0;
}



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "elf.h"

#define SHDRS 16
/*
.dynsym .dynstr .hash .rel.dyn .rel.plt
.plt .text .ARM.extab .ARM.exidx .fini_array
.init_array .dynamic .got .data
*/
#define NONE 0
#define DYNSYM 1
#define DYNSTR 2
#define HASH 3
#define RELDYN 4
#define RELPLT 5
#define PLT 6
#define TEXT 7
#define ARMEXIDX 8
#define FINIARRAY 9
#define INITARRAY 10
#define DYNAMIC 11
#define GOT 12
#define DATA 13
#define BSS 14
#define STRTAB 15
//


#ifndef _QEMU_ELF_H
#define _QEMU_ELF_H
#include <inttypes.h>
/* 32-bit ELF base types. */
typedef uint32_t Elf32_Addr;
typedef uint16_t Elf32_Half;
typedef uint32_t Elf32_Off;
typedef int32_tElf32_Sword;
typedef uint32_t Elf32_Word;
/* 64-bit ELF base types. */
typedef uint64_t Elf64_Addr;
typedef uint16_t Elf64_Half;
typedef int16_t         Elf64_SHalf;
typedef uint64_t Elf64_Off;
typedef int32_t         Elf64_Sword;
typedef uint32_t Elf64_Word;
typedef uint64_t Elf64_Xword;
typedef int64_tElf64_Sxword;
/* These constants are for the segment types stored in the image headers */
#define PT_NULL    0
#define PT_LOAD    1
#define PT_DYNAMIC 2
#define PT_INTERP3
#define PT_NOTE    4
#define PT_SHLIB   5
#define PT_PHDR    6
#define PT_LOPROC0x70000000
#define PT_HIPROC0x7fffffff
#define PT_MIPS_REGINFO      0x70000000
#define PT_MIPS_OPTIONS      0x70000001
/* Flags in the e_flags field of the header */
/* MIPS architecture level. */
#define EF_MIPS_ARCH_1      0x00000000      /* -mips1 code.*/
#define EF_MIPS_ARCH_2      0x10000000      /* -mips2 code.*/
#define EF_MIPS_ARCH_3      0x20000000      /* -mips3 code.*/
#define EF_MIPS_ARCH_4      0x30000000      /* -mips4 code.*/
#define EF_MIPS_ARCH_5      0x40000000      /* -mips5 code.*/
#define EF_MIPS_ARCH_32      0x50000000      /* MIPS32 code.*/
#define EF_MIPS_ARCH_64      0x60000000      /* MIPS64 code.*/
/* The ABI of a file. */
#define EF_MIPS_ABI_O32      0x00001000      /* O32 ABI.*/
#define EF_MIPS_ABI_O64      0x00002000      /* O32 extended for 64 bit.*/
#define EF_MIPS_NOREORDER 0x00000001
#define EF_MIPS_PIC       0x00000002
#define EF_MIPS_CPIC      0x00000004
#define EF_MIPS_ABI2      0x00000020
#define EF_MIPS_OPTIONS_FIRST      0x00000080
#define EF_MIPS_32BITMODE      0x00000100
#define EF_MIPS_ABI      0x0000f000
#define EF_MIPS_ARCH      0xf0000000
/* These constants define the different elf file types */
#define ET_NONE   0
#define ET_REL    1
#define ET_EXEC   2
#define ET_DYN    3
#define ET_CORE   4
#define ET_LOPROC 0xff00
#define ET_HIPROC 0xffff
/* These constants define the various ELF target machines */
#define EM_NONE0
#define EM_M32   1
#define EM_SPARC 2
#define EM_386   3
#define EM_68K   4
#define EM_88K   5
#define EM_486   6   /* Perhaps disused */
#define EM_860   7
#define EM_MIPS      8      /* MIPS R3000 (officially, big-endian only) */
#define EM_MIPS_RS4_BE 10      /* MIPS R4000 big-endian */
#define EM_PARISC      15      /* HPPA */
#define EM_SPARC32PLUS 18      /* Sun's "v8plus" */
#define EM_PPC               20      /* PowerPC */
#define EM_PPC64       21       /* PowerPC64 */
#define EM_ARM      40      /* ARM */
#define EM_SH               42      /* SuperH */
#define EM_SPARCV9   43      /* SPARC v9 64-bit */
#define EM_IA_64      50      /* HP/Intel IA-64 */
#define EM_X86_64      62      /* AMD x86-64 */
#define EM_S390      22      /* IBM S/390 */
#define EM_CRIS         76      /* Axis Communications 32-bit embedded processor */
#define EM_V850      87      /* NEC v850 */
#define EM_H8_300H      47      /* Hitachi H8/300H */
#define EM_H8S          48      /* Hitachi H8S   */
/*
* This is an interim value that we will use until the committee comes
* up with a final number.
*/
#define EM_ALPHA      0x9026
/* Bogus old v850 magic number, used by old tools.*/
#define EM_CYGNUS_V850      0x9080
/*
* This is the old interim value for S/390 architecture
*/
#define EM_S390_OLD   0xA390
/* This is the info that is needed to parse the dynamic section of the file */
#define DT_NULL      0
#define DT_NEEDED      1
#define DT_PLTRELSZ      2
#define DT_PLTGOT      3
#define DT_HASH                4
#define DT_STRTAB      5
#define DT_SYMTAB      6
#define DT_RELA                7
#define DT_RELASZ      8
#define DT_RELAENT      9
#define DT_STRSZ      10
#define DT_SYMENT      11
#define DT_INIT                25
#define DT_FINI                26
#define DT_SONAME      14
#define DT_RPATH         15
#define DT_SYMBOLIC      16
#define DT_REL            17
#define DT_RELSZ      18
#define DT_RELENT      19
#define DT_PLTREL      20
#define DT_DEBUG      21
#define DT_TEXTREL      22
#define DT_JMPREL      23
#define DT_LOPROC      0x70000000
#define DT_HIPROC      0x7fffffff
#define DT_MIPS_RLD_VERSION      0x70000001
#define DT_MIPS_TIME_STAMP      0x70000002
#define DT_MIPS_ICHECKSUM      0x70000003
#define DT_MIPS_IVERSION      0x70000004
#define DT_MIPS_FLAGS      0x70000005
#define RHF_NONE          0
#define RHF_HARDWAY          1
#define RHF_NOTPOT          2
#define DT_MIPS_BASE_ADDRESS      0x70000006
#define DT_MIPS_CONFLICT      0x70000008
#define DT_MIPS_LIBLIST      0x70000009
#define DT_MIPS_LOCAL_GOTNO      0x7000000a
#define DT_MIPS_CONFLICTNO      0x7000000b
#define DT_MIPS_LIBLISTNO      0x70000010
#define DT_MIPS_SYMTABNO      0x70000011
#define DT_MIPS_UNREFEXTNO      0x70000012
#define DT_MIPS_GOTSYM      0x70000013
#define DT_MIPS_HIPAGENO      0x70000014
#define DT_MIPS_RLD_MAP      0x70000016
/* This info is needed when parsing the symbol table */
#define STB_LOCAL0
#define STB_GLOBAL 1
#define STB_WEAK   2
#define STT_NOTYPE0
#define STT_OBJECT1
#define STT_FUNC    2
#define STT_SECTION 3
#define STT_FILE    4
#define ELF_ST_BIND(x)      ((x) >> 4)
#define ELF_ST_TYPE(x)      (((unsigned int) x) & 0xf)
#define ELF32_ST_BIND(x)      ELF_ST_BIND(x)
#define ELF32_ST_TYPE(x)      ELF_ST_TYPE(x)
#define ELF64_ST_BIND(x)      ELF_ST_BIND(x)
#define ELF64_ST_TYPE(x)      ELF_ST_TYPE(x)
/* Symbolic values for the entries in the auxiliary table
   put on the initial stack */
#define AT_NULL   0      /* end of vector */
#define AT_IGNORE 1      /* entry should be ignored */
#define AT_EXECFD 2      /* file descriptor of program */
#define AT_PHDR   3      /* program headers for program */
#define AT_PHENT4      /* size of program header entry */
#define AT_PHNUM5      /* number of program headers */
#define AT_PAGESZ 6      /* system page size */
#define AT_BASE   7      /* base address of interpreter */
#define AT_FLAGS8      /* flags */
#define AT_ENTRY9      /* entry point of program */
#define AT_NOTELF 10      /* program is not ELF */
#define AT_UID    11      /* real uid */
#define AT_EUID   12      /* effective uid */
#define AT_GID    13      /* real gid */
#define AT_EGID   14      /* effective gid */
#define AT_PLATFORM 15/* string identifying CPU for optimizations */
#define AT_HWCAP16    /* arch dependent hints at CPU capabilities */
#define AT_CLKTCK 17      /* frequency at which times() increments */
typedef struct dynamic{
Elf32_Sword d_tag;
union{
    Elf32_Sword      d_val;
    Elf32_Addr      d_ptr;
} d_un;
} Elf32_Dyn;
typedef struct {
Elf64_Sxword d_tag;      /* entry tag value */
union {
    Elf64_Xword d_val;
    Elf64_Addr d_ptr;
} d_un;
} Elf64_Dyn;
/* The following are used with relocations */
#define ELF32_R_SYM(x) ((x) >> 8)
#define ELF32_R_TYPE(x) ((x) & 0xff)
#define ELF64_R_SYM(i)      ((i) >> 32)
#define ELF64_R_TYPE(i)      ((i) & 0xffffffff)
#define ELF64_R_TYPE_DATA(i)            (((ELF64_R_TYPE(i) >> 8) ^ 0x00800000) - 0x00800000)
#define R_386_NONE      0
#define R_386_32      1
#define R_386_PC32      2
#define R_386_GOT32      3
#define R_386_PLT32      4
#define R_386_COPY      5
#define R_386_GLOB_DAT      6
#define R_386_JMP_SLOT      7
#define R_386_RELATIVE      8
#define R_386_GOTOFF      9
#define R_386_GOTPC      10
#define R_386_NUM      11
#define R_MIPS_NONE      0
#define R_MIPS_16      1
#define R_MIPS_32      2
#define R_MIPS_REL32      3
#define R_MIPS_26      4
#define R_MIPS_HI16      5
#define R_MIPS_LO16      6
#define R_MIPS_GPREL16      7
#define R_MIPS_LITERAL      8
#define R_MIPS_GOT16      9
#define R_MIPS_PC16      10
#define R_MIPS_CALL16      11
#define R_MIPS_GPREL32      12
/* The remaining relocs are defined on Irix, although they are not
   in the MIPS ELF ABI.*/
#define R_MIPS_UNUSED1      13
#define R_MIPS_UNUSED2      14
#define R_MIPS_UNUSED3      15
#define R_MIPS_SHIFT5      16
#define R_MIPS_SHIFT6      17
#define R_MIPS_64      18
#define R_MIPS_GOT_DISP      19
#define R_MIPS_GOT_PAGE      20
#define R_MIPS_GOT_OFST      21
/*
* The following two relocation types are specified in the MIPS ABI
* conformance guide version 1.2 but not yet in the psABI.
*/
#define R_MIPS_GOTHI16      22
#define R_MIPS_GOTLO16      23
#define R_MIPS_SUB      24
#define R_MIPS_INSERT_A      25
#define R_MIPS_INSERT_B      26
#define R_MIPS_DELETE      27
#define R_MIPS_HIGHER      28
#define R_MIPS_HIGHEST      29
/*
* The following two relocation types are specified in the MIPS ABI
* conformance guide version 1.2 but not yet in the psABI.
*/
#define R_MIPS_CALLHI16      30
#define R_MIPS_CALLLO16      31
/*
* This range is reserved for vendor specific relocations.
*/
#define R_MIPS_LOVENDOR      100
#define R_MIPS_HIVENDOR      127
/*
* Sparc ELF relocation types
*/
#define      R_SPARC_NONE      0
#define      R_SPARC_8      1
#define      R_SPARC_16      2
#define      R_SPARC_32      3
#define      R_SPARC_DISP8      4
#define      R_SPARC_DISP16      5
#define      R_SPARC_DISP32      6
#define      R_SPARC_WDISP30      7
#define      R_SPARC_WDISP22      8
#define      R_SPARC_HI22      9
#define      R_SPARC_22      10
#define      R_SPARC_13      11
#define      R_SPARC_LO10      12
#define      R_SPARC_GOT10      13
#define      R_SPARC_GOT13      14
#define      R_SPARC_GOT22      15
#define      R_SPARC_PC10      16
#define      R_SPARC_PC22      17
#define      R_SPARC_WPLT30      18
#define      R_SPARC_COPY      19
#define      R_SPARC_GLOB_DAT      20
#define      R_SPARC_JMP_SLOT      21
#define      R_SPARC_RELATIVE      22
#define      R_SPARC_UA32      23
#define R_SPARC_PLT32      24
#define R_SPARC_HIPLT22      25
#define R_SPARC_LOPLT10      26
#define R_SPARC_PCPLT32      27
#define R_SPARC_PCPLT22      28
#define R_SPARC_PCPLT10      29
#define R_SPARC_10      30
#define R_SPARC_11      31
#define R_SPARC_64      32
#define R_SPARC_OLO10         33
#define R_SPARC_HH22            34
#define R_SPARC_HM10            35
#define R_SPARC_LM22            36
#define R_SPARC_WDISP16      40
#define R_SPARC_WDISP19      41
#define R_SPARC_7      43
#define R_SPARC_5      44
#define R_SPARC_6      45
/* Bits present in AT_HWCAP, primarily for Sparc32.*/
#define HWCAP_SPARC_FLUSH       1    /* CPU supports flush instruction. */
#define HWCAP_SPARC_STBAR       2
#define HWCAP_SPARC_SWAP      4
#define HWCAP_SPARC_MULDIV      8
#define HWCAP_SPARC_V9      16
#define HWCAP_SPARC_ULTRA3      32
/*
* 68k ELF relocation types
*/
#define R_68K_NONE      0
#define R_68K_32      1
#define R_68K_16      2
#define R_68K_8      3
#define R_68K_PC32      4
#define R_68K_PC16      5
#define R_68K_PC8      6
#define R_68K_GOT32      7
#define R_68K_GOT16      8
#define R_68K_GOT8      9
#define R_68K_GOT32O      10
#define R_68K_GOT16O      11
#define R_68K_GOT8O      12
#define R_68K_PLT32      13
#define R_68K_PLT16      14
#define R_68K_PLT8      15
#define R_68K_PLT32O      16
#define R_68K_PLT16O      17
#define R_68K_PLT8O      18
#define R_68K_COPY      19
#define R_68K_GLOB_DAT      20
#define R_68K_JMP_SLOT      21
#define R_68K_RELATIVE      22
/*
* Alpha ELF relocation types
*/
#define R_ALPHA_NONE            0       /* No reloc */
#define R_ALPHA_REFLONG         1       /* Direct 32 bit */
#define R_ALPHA_REFQUAD         2       /* Direct 64 bit */
#define R_ALPHA_GPREL32         3       /* GP relative 32 bit */
#define R_ALPHA_LITERAL         4       /* GP relative 16 bit w/optimization */
#define R_ALPHA_LITUSE          5       /* Optimization hint for LITERAL */
#define R_ALPHA_GPDISP          6       /* Add displacement to GP */
#define R_ALPHA_BRADDR          7       /* PC+4 relative 23 bit shifted */
#define R_ALPHA_HINT            8       /* PC+4 relative 16 bit shifted */
#define R_ALPHA_SREL16          9       /* PC relative 16 bit */
#define R_ALPHA_SREL32          10      /* PC relative 32 bit */
#define R_ALPHA_SREL64          11      /* PC relative 64 bit */
#define R_ALPHA_GPRELHIGH       17      /* GP relative 32 bit, high 16 bits */
#define R_ALPHA_GPRELLOW      18      /* GP relative 32 bit, low 16 bits */
#define R_ALPHA_GPREL16         19      /* GP relative 16 bit */
#define R_ALPHA_COPY            24      /* Copy symbol at runtime */
#define R_ALPHA_GLOB_DAT      25      /* Create GOT entry */
#define R_ALPHA_JMP_SLOT      26      /* Create PLT entry */
#define R_ALPHA_RELATIVE      27      /* Adjust by program base */
#define R_ALPHA_BRSGP      28
#define R_ALPHA_TLSGD         29
#define R_ALPHA_TLS_LDM         30
#define R_ALPHA_DTPMOD64      31
#define R_ALPHA_GOTDTPREL       32
#define R_ALPHA_DTPREL64      33
#define R_ALPHA_DTPRELHI      34
#define R_ALPHA_DTPRELLO      35
#define R_ALPHA_DTPREL16      36
#define R_ALPHA_GOTTPREL      37
#define R_ALPHA_TPREL64         38
#define R_ALPHA_TPRELHI         39
#define R_ALPHA_TPRELLO         40
#define R_ALPHA_TPREL16         41
#define SHF_ALPHA_GPREL      0x10000000
/* PowerPC relocations defined by the ABIs */
#define R_PPC_NONE      0
#define R_PPC_ADDR32      1      /* 32bit absolute address */
#define R_PPC_ADDR24      2      /* 26bit address, 2 bits ignored.*/
#define R_PPC_ADDR16      3      /* 16bit absolute address */
#define R_PPC_ADDR16_LO      4      /* lower 16bit of absolute address */
#define R_PPC_ADDR16_HI      5      /* high 16bit of absolute address */
#define R_PPC_ADDR16_HA      6      /* adjusted high 16bit */
#define R_PPC_ADDR14      7      /* 16bit address, 2 bits ignored */
#define R_PPC_ADDR14_BRTAKEN      8
#define R_PPC_ADDR14_BRNTAKEN      9
#define R_PPC_REL24      10      /* PC relative 26 bit */
#define R_PPC_REL14      11      /* PC relative 16 bit */
#define R_PPC_REL14_BRTAKEN      12
#define R_PPC_REL14_BRNTAKEN      13
#define R_PPC_GOT16      14
#define R_PPC_GOT16_LO      15
#define R_PPC_GOT16_HI      16
#define R_PPC_GOT16_HA      17
#define R_PPC_PLTREL24      18
#define R_PPC_COPY      19
#define R_PPC_GLOB_DAT      20
#define R_PPC_JMP_SLOT      21
#define R_PPC_RELATIVE      22
#define R_PPC_LOCAL24PC      23
#define R_PPC_UADDR32      24
#define R_PPC_UADDR16      25
#define R_PPC_REL32      26
#define R_PPC_PLT32      27
#define R_PPC_PLTREL32      28
#define R_PPC_PLT16_LO      29
#define R_PPC_PLT16_HI      30
#define R_PPC_PLT16_HA      31
#define R_PPC_SDAREL16      32
#define R_PPC_SECTOFF      33
#define R_PPC_SECTOFF_LO      34
#define R_PPC_SECTOFF_HI      35
#define R_PPC_SECTOFF_HA      36
/* Keep this the last entry.*/
#define R_PPC_NUM      37
/* ARM specific declarations */
/* Processor specific flags for the ELF header e_flags field.*/
#define EF_ARM_RELEXEC   0x01
#define EF_ARM_HASENTRY    0x02
#define EF_ARM_INTERWORK   0x04
#define EF_ARM_APCS_26   0x08
#define EF_ARM_APCS_FLOAT0x10
#define EF_ARM_PIC         0x20
#define EF_ALIGN8          0x40      /* 8-bit structure alignment is in use */
#define EF_NEW_ABI         0x80
#define EF_OLD_ABI         0x100
/* Additional symbol types for Thumb */
#define STT_ARM_TFUNC      0xd
/* ARM-specific values for sh_flags */
#define SHF_ARM_ENTRYSECT0x10000000   /* Section contains an entry point */
#define SHF_ARM_COMDEF   0x80000000   /* Section may be multiply defined
   in the input to a link step */
/* ARM-specific program header flags */
#define PF_ARM_SB          0x10000000   /* Segment contains the location
   addressed by the static base */
/* ARM relocs.*/
#define R_ARM_NONE      0      /* No reloc */
#define R_ARM_PC24      1      /* PC relative 26 bit branch */
#define R_ARM_ABS32      2      /* Direct 32 bit*/
#define R_ARM_REL32      3      /* PC relative 32 bit */
#define R_ARM_PC13      4
#define R_ARM_ABS16      5      /* Direct 16 bit */
#define R_ARM_ABS12      6      /* Direct 12 bit */
#define R_ARM_THM_ABS5      7
#define R_ARM_ABS8      8      /* Direct 8 bit */
#define R_ARM_SBREL32      9
#define R_ARM_THM_PC22      10
#define R_ARM_THM_PC8      11
#define R_ARM_AMP_VCALL9      12
#define R_ARM_SWI24      13
#define R_ARM_THM_SWI8      14
#define R_ARM_XPC25      15
#define R_ARM_THM_XPC22      16
#define R_ARM_COPY      20      /* Copy symbol at runtime */
#define R_ARM_GLOB_DAT      21      /* Create GOT entry */
#define R_ARM_JUMP_SLOT      22      /* Create PLT entry */
#define R_ARM_RELATIVE      23      /* Adjust by program base */
#define R_ARM_GOTOFF      24      /* 32 bit offset to GOT */
#define R_ARM_GOTPC      25      /* 32 bit PC relative offset to GOT */
#define R_ARM_GOT32      26      /* 32 bit GOT entry */
#define R_ARM_PLT32      27      /* 32 bit PLT address */
#define R_ARM_CALL            28
#define R_ARM_JUMP24            29
#define R_ARM_GNU_VTENTRY      100
#define R_ARM_GNU_VTINHERIT      101
#define R_ARM_THM_PC11      102      /* thumb unconditional branch */
#define R_ARM_THM_PC9      103      /* thumb conditional branch */
#define R_ARM_RXPC25      249
#define R_ARM_RSBREL32      250
#define R_ARM_THM_RPC22      251
#define R_ARM_RREL32      252
#define R_ARM_RABS22      253
#define R_ARM_RPC24      254
#define R_ARM_RBASE      255
/* Keep this the last entry.*/
#define R_ARM_NUM      256
/* s390 relocations defined by the ABIs */
#define R_390_NONE      0      /* No reloc.*/
#define R_390_8      1      /* Direct 8 bit.*/
#define R_390_12      2      /* Direct 12 bit.*/
#define R_390_16      3      /* Direct 16 bit.*/
#define R_390_32      4      /* Direct 32 bit.*/
#define R_390_PC32      5      /* PC relative 32 bit.      */
#define R_390_GOT12      6      /* 12 bit GOT offset.*/
#define R_390_GOT32      7      /* 32 bit GOT offset.*/
#define R_390_PLT32      8      /* 32 bit PC relative PLT address.*/
#define R_390_COPY      9      /* Copy symbol at runtime.*/
#define R_390_GLOB_DAT      10      /* Create GOT entry.*/
#define R_390_JMP_SLOT      11      /* Create PLT entry.*/
#define R_390_RELATIVE      12      /* Adjust by program base.*/
#define R_390_GOTOFF32      13      /* 32 bit offset to GOT.         */
#define R_390_GOTPC      14      /* 32 bit PC rel. offset to GOT.*/
#define R_390_GOT16      15      /* 16 bit GOT offset.*/
#define R_390_PC16      16      /* PC relative 16 bit.      */
#define R_390_PC16DBL      17      /* PC relative 16 bit shifted by 1.*/
#define R_390_PLT16DBL      18      /* 16 bit PC rel. PLT shifted by 1.*/
#define R_390_PC32DBL      19      /* PC relative 32 bit shifted by 1.*/
#define R_390_PLT32DBL      20      /* 32 bit PC rel. PLT shifted by 1.*/
#define R_390_GOTPCDBL      21      /* 32 bit PC rel. GOT shifted by 1.*/
#define R_390_64      22      /* Direct 64 bit.*/
#define R_390_PC64      23      /* PC relative 64 bit.      */
#define R_390_GOT64      24      /* 64 bit GOT offset.*/
#define R_390_PLT64      25      /* 64 bit PC relative PLT address.*/
#define R_390_GOTENT      26      /* 32 bit PC rel. to GOT entry >> 1. */
#define R_390_GOTOFF16      27      /* 16 bit offset to GOT. */
#define R_390_GOTOFF64      28      /* 64 bit offset to GOT. */
#define R_390_GOTPLT12      29      /* 12 bit offset to jump slot.      */
#define R_390_GOTPLT16      30      /* 16 bit offset to jump slot.      */
#define R_390_GOTPLT32      31      /* 32 bit offset to jump slot.      */
#define R_390_GOTPLT64      32      /* 64 bit offset to jump slot.      */
#define R_390_GOTPLTENT      33      /* 32 bit rel. offset to jump slot.*/
#define R_390_PLTOFF16      34      /* 16 bit offset from GOT to PLT. */
#define R_390_PLTOFF32      35      /* 32 bit offset from GOT to PLT. */
#define R_390_PLTOFF64      36      /* 16 bit offset from GOT to PLT. */
#define R_390_TLS_LOAD      37      /* Tag for load insn in TLS code. */
#define R_390_TLS_GDCALL      38      /* Tag for function call in general
                                           dynamic TLS code.*/
#define R_390_TLS_LDCALL      39      /* Tag for function call in local
                                           dynamic TLS code.*/
#define R_390_TLS_GD32      40      /* Direct 32 bit for general dynamic
                                           thread local data.*/
#define R_390_TLS_GD64      41      /* Direct 64 bit for general dynamic
                                           thread local data.*/
#define R_390_TLS_GOTIE12      42      /* 12 bit GOT offset for static TLS
                                           block offset.*/
#define R_390_TLS_GOTIE32      43      /* 32 bit GOT offset for static TLS
                                           block offset.*/
#define R_390_TLS_GOTIE64      44      /* 64 bit GOT offset for static TLS
                                           block offset.*/
#define R_390_TLS_LDM32      45      /* Direct 32 bit for local dynamic
                                           thread local data in LD code.*/
#define R_390_TLS_LDM64      46      /* Direct 64 bit for local dynamic
                                           thread local data in LD code.*/
#define R_390_TLS_IE32      47      /* 32 bit address of GOT entry for
                                           negated static TLS block offset.*/
#define R_390_TLS_IE64      48      /* 64 bit address of GOT entry for
                                           negated static TLS block offset.*/
#define R_390_TLS_IEENT      49      /* 32 bit rel. offset to GOT entry for
                                           negated static TLS block offset.*/
#define R_390_TLS_LE32      50      /* 32 bit negated offset relative to
                                           static TLS block.*/
#define R_390_TLS_LE64      51      /* 64 bit negated offset relative to
                                           static TLS block.*/
#define R_390_TLS_LDO32      52      /* 32 bit offset relative to TLS
                                           block.*/
#define R_390_TLS_LDO64      53      /* 64 bit offset relative to TLS
                                           block.*/
#define R_390_TLS_DTPMOD      54      /* ID of module containing symbol.*/
#define R_390_TLS_DTPOFF      55      /* Offset in TLS block.*/
#define R_390_TLS_TPOFF      56      /* Negate offset in static TLS
                                           block.*/
/* Keep this the last entry.*/
#define R_390_NUM      57
/* x86-64 relocation types */
#define R_X86_64_NONE      0      /* No reloc */
#define R_X86_64_64      1      /* Direct 64 bit*/
#define R_X86_64_PC32      2      /* PC relative 32 bit signed */
#define R_X86_64_GOT32      3      /* 32 bit GOT entry */
#define R_X86_64_PLT32      4      /* 32 bit PLT address */
#define R_X86_64_COPY      5      /* Copy symbol at runtime */
#define R_X86_64_GLOB_DAT      6      /* Create GOT entry */
#define R_X86_64_JUMP_SLOT      7      /* Create PLT entry */
#define R_X86_64_RELATIVE      8      /* Adjust by program base */
#define R_X86_64_GOTPCREL      9      /* 32 bit signed pc relative
   offset to GOT */
#define R_X86_64_32      10      /* Direct 32 bit zero extended */
#define R_X86_64_32S      11      /* Direct 32 bit sign extended */
#define R_X86_64_16      12      /* Direct 16 bit zero extended */
#define R_X86_64_PC16      13      /* 16 bit sign extended pc relative */
#define R_X86_64_8      14      /* Direct 8 bit sign extended*/
#define R_X86_64_PC8      15      /* 8 bit sign extended pc relative */
#define R_X86_64_NUM      16
/* Legal values for e_flags field of Elf64_Ehdr.*/
#define EF_ALPHA_32BIT      1      /* All addresses are below 2GB */
/* HPPA specific definitions.*/
/* Legal values for e_flags field of Elf32_Ehdr.*/
#define EF_PARISC_TRAPNIL      0x00010000 /* Trap nil pointer dereference.*/
#define EF_PARISC_EXT      0x00020000 /* Program uses arch. extensions. */
#define EF_PARISC_LSB      0x00040000 /* Program expects little endian. */
#define EF_PARISC_WIDE      0x00080000 /* Program expects wide mode.*/
#define EF_PARISC_NO_KABP      0x00100000 /* No kernel assisted branch
      prediction.*/
#define EF_PARISC_LAZYSWAP      0x00400000 /* Allow lazy swapping.*/
#define EF_PARISC_ARCH      0x0000ffff /* Architecture version.*/
/* Defined values for `e_flags & EF_PARISC_ARCH' are:*/
#define EFA_PARISC_1_0            0x020b /* PA-RISC 1.0 big-endian.*/
#define EFA_PARISC_1_1            0x0210 /* PA-RISC 1.1 big-endian.*/
#define EFA_PARISC_2_0            0x0214 /* PA-RISC 2.0 big-endian.*/
/* Additional section indeces.*/
#define SHN_PARISC_ANSI_COMMON      0xff00         /* Section for tenatively declared
      symbols in ANSI C.*/
#define SHN_PARISC_HUGE_COMMON      0xff01         /* Common blocks in huge model.*/
/* Legal values for sh_type field of Elf32_Shdr.*/
#define SHT_PARISC_EXT      0x70000000 /* Contains product specific ext. */
#define SHT_PARISC_UNWIND      0x70000001 /* Unwind information.*/
#define SHT_PARISC_DOC      0x70000002 /* Debug info for optimized code. */
/* Legal values for sh_flags field of Elf32_Shdr.*/
#define SHF_PARISC_SHORT      0x20000000 /* Section with short addressing. */
#define SHF_PARISC_HUGE      0x40000000 /* Section far from gp.*/
#define SHF_PARISC_SBP      0x80000000 /* Static branch prediction code. */
/* Legal values for ST_TYPE subfield of st_info (symbol type).*/
#define STT_PARISC_MILLICODE      13      /* Millicode function entry point.*/
#define STT_HP_OPAQUE      (STT_LOOS + 0x1)
#define STT_HP_STUB      (STT_LOOS + 0x2)
/* HPPA relocs.*/
#define R_PARISC_NONE      0      /* No reloc.*/
#define R_PARISC_DIR32      1      /* Direct 32-bit reference.*/
#define R_PARISC_DIR21L      2      /* Left 21 bits of eff. address.*/
#define R_PARISC_DIR17R      3      /* Right 17 bits of eff. address.*/
#define R_PARISC_DIR17F      4      /* 17 bits of eff. address.*/
#define R_PARISC_DIR14R      6      /* Right 14 bits of eff. address.*/
#define R_PARISC_PCREL32      9      /* 32-bit rel. address.*/
#define R_PARISC_PCREL21L      10      /* Left 21 bits of rel. address.*/
#define R_PARISC_PCREL17R      11      /* Right 17 bits of rel. address.*/
#define R_PARISC_PCREL17F      12      /* 17 bits of rel. address.*/
#define R_PARISC_PCREL14R      14      /* Right 14 bits of rel. address.*/
#define R_PARISC_DPREL21L      18      /* Left 21 bits of rel. address.*/
#define R_PARISC_DPREL14R      22      /* Right 14 bits of rel. address.*/
#define R_PARISC_GPREL21L      26      /* GP-relative, left 21 bits.*/
#define R_PARISC_GPREL14R      30      /* GP-relative, right 14 bits.*/
#define R_PARISC_LTOFF21L      34      /* LT-relative, left 21 bits.*/
#define R_PARISC_LTOFF14R      38      /* LT-relative, right 14 bits.*/
#define R_PARISC_SECREL32      41      /* 32 bits section rel. address.*/
#define R_PARISC_SEGBASE      48      /* No relocation, set segment base.*/
#define R_PARISC_SEGREL32      49      /* 32 bits segment rel. address.*/
#define R_PARISC_PLTOFF21L      50      /* PLT rel. address, left 21 bits.*/
#define R_PARISC_PLTOFF14R      54      /* PLT rel. address, right 14 bits.*/
#define R_PARISC_LTOFF_FPTR32      57      /* 32 bits LT-rel. function pointer. */
#define R_PARISC_LTOFF_FPTR21L      58      /* LT-rel. fct ptr, left 21 bits. */
#define R_PARISC_LTOFF_FPTR14R      62      /* LT-rel. fct ptr, right 14 bits. */
#define R_PARISC_FPTR64      64      /* 64 bits function address.*/
#define R_PARISC_PLABEL32      65      /* 32 bits function address.*/
#define R_PARISC_PCREL64      72      /* 64 bits PC-rel. address.*/
#define R_PARISC_PCREL22F      74      /* 22 bits PC-rel. address.*/
#define R_PARISC_PCREL14WR      75      /* PC-rel. address, right 14 bits.*/
#define R_PARISC_PCREL14DR      76      /* PC rel. address, right 14 bits.*/
#define R_PARISC_PCREL16F      77      /* 16 bits PC-rel. address.*/
#define R_PARISC_PCREL16WF      78      /* 16 bits PC-rel. address.*/
#define R_PARISC_PCREL16DF      79      /* 16 bits PC-rel. address.*/
#define R_PARISC_DIR64      80      /* 64 bits of eff. address.*/
#define R_PARISC_DIR14WR      83      /* 14 bits of eff. address.*/
#define R_PARISC_DIR14DR      84      /* 14 bits of eff. address.*/
#define R_PARISC_DIR16F      85      /* 16 bits of eff. address.*/
#define R_PARISC_DIR16WF      86      /* 16 bits of eff. address.*/
#define R_PARISC_DIR16DF      87      /* 16 bits of eff. address.*/
#define R_PARISC_GPREL64      88      /* 64 bits of GP-rel. address.*/
#define R_PARISC_GPREL14WR      91      /* GP-rel. address, right 14 bits.*/
#define R_PARISC_GPREL14DR      92      /* GP-rel. address, right 14 bits.*/
#define R_PARISC_GPREL16F      93      /* 16 bits GP-rel. address.*/
#define R_PARISC_GPREL16WF      94      /* 16 bits GP-rel. address.*/
#define R_PARISC_GPREL16DF      95      /* 16 bits GP-rel. address.*/
#define R_PARISC_LTOFF64      96      /* 64 bits LT-rel. address.*/
#define R_PARISC_LTOFF14WR      99      /* LT-rel. address, right 14 bits.*/
#define R_PARISC_LTOFF14DR      100      /* LT-rel. address, right 14 bits.*/
#define R_PARISC_LTOFF16F      101      /* 16 bits LT-rel. address.*/
#define R_PARISC_LTOFF16WF      102      /* 16 bits LT-rel. address.*/
#define R_PARISC_LTOFF16DF      103      /* 16 bits LT-rel. address.*/
#define R_PARISC_SECREL64      104      /* 64 bits section rel. address.*/
#define R_PARISC_SEGREL64      112      /* 64 bits segment rel. address.*/
#define R_PARISC_PLTOFF14WR      115      /* PLT-rel. address, right 14 bits.*/
#define R_PARISC_PLTOFF14DR      116      /* PLT-rel. address, right 14 bits.*/
#define R_PARISC_PLTOFF16F      117      /* 16 bits LT-rel. address.*/
#define R_PARISC_PLTOFF16WF      118      /* 16 bits PLT-rel. address.*/
#define R_PARISC_PLTOFF16DF      119      /* 16 bits PLT-rel. address.*/
#define R_PARISC_LTOFF_FPTR64      120      /* 64 bits LT-rel. function ptr.*/
#define R_PARISC_LTOFF_FPTR14WR      123      /* LT-rel. fct. ptr., right 14 bits. */
#define R_PARISC_LTOFF_FPTR14DR      124      /* LT-rel. fct. ptr., right 14 bits. */
#define R_PARISC_LTOFF_FPTR16F      125      /* 16 bits LT-rel. function ptr.*/
#define R_PARISC_LTOFF_FPTR16WF      126      /* 16 bits LT-rel. function ptr.*/
#define R_PARISC_LTOFF_FPTR16DF      127      /* 16 bits LT-rel. function ptr.*/
#define R_PARISC_LORESERVE      128
#define R_PARISC_COPY      128      /* Copy relocation.*/
#define R_PARISC_IPLT      129      /* Dynamic reloc, imported PLT */
#define R_PARISC_EPLT      130      /* Dynamic reloc, exported PLT */
#define R_PARISC_TPREL32      153      /* 32 bits TP-rel. address.*/
#define R_PARISC_TPREL21L      154      /* TP-rel. address, left 21 bits.*/
#define R_PARISC_TPREL14R      158      /* TP-rel. address, right 14 bits.*/
#define R_PARISC_LTOFF_TP21L      162      /* LT-TP-rel. address, left 21 bits. */
#define R_PARISC_LTOFF_TP14R      166      /* LT-TP-rel. address, right 14 bits.*/
#define R_PARISC_LTOFF_TP14F      167      /* 14 bits LT-TP-rel. address.*/
#define R_PARISC_TPREL64      216      /* 64 bits TP-rel. address.*/
#define R_PARISC_TPREL14WR      219      /* TP-rel. address, right 14 bits.*/
#define R_PARISC_TPREL14DR      220      /* TP-rel. address, right 14 bits.*/
#define R_PARISC_TPREL16F      221      /* 16 bits TP-rel. address.*/
#define R_PARISC_TPREL16WF      222      /* 16 bits TP-rel. address.*/
#define R_PARISC_TPREL16DF      223      /* 16 bits TP-rel. address.*/
#define R_PARISC_LTOFF_TP64      224      /* 64 bits LT-TP-rel. address.*/
#define R_PARISC_LTOFF_TP14WR      227      /* LT-TP-rel. address, right 14 bits.*/
#define R_PARISC_LTOFF_TP14DR      228      /* LT-TP-rel. address, right 14 bits.*/
#define R_PARISC_LTOFF_TP16F      229      /* 16 bits LT-TP-rel. address.*/
#define R_PARISC_LTOFF_TP16WF      230      /* 16 bits LT-TP-rel. address.*/
#define R_PARISC_LTOFF_TP16DF      231      /* 16 bits LT-TP-rel. address.*/
#define R_PARISC_HIRESERVE      255
/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr.*/
#define PT_HP_TLS      (PT_LOOS + 0x0)
#define PT_HP_CORE_NONE      (PT_LOOS + 0x1)
#define PT_HP_CORE_VERSION      (PT_LOOS + 0x2)
#define PT_HP_CORE_KERNEL      (PT_LOOS + 0x3)
#define PT_HP_CORE_COMM      (PT_LOOS + 0x4)
#define PT_HP_CORE_PROC      (PT_LOOS + 0x5)
#define PT_HP_CORE_LOADABLE      (PT_LOOS + 0x6)
#define PT_HP_CORE_STACK      (PT_LOOS + 0x7)
#define PT_HP_CORE_SHM      (PT_LOOS + 0x8)
#define PT_HP_CORE_MMF      (PT_LOOS + 0x9)
#define PT_HP_PARALLEL      (PT_LOOS + 0x10)
#define PT_HP_FASTBIND      (PT_LOOS + 0x11)
#define PT_HP_OPT_ANNOT      (PT_LOOS + 0x12)
#define PT_HP_HSL_ANNOT      (PT_LOOS + 0x13)
#define PT_HP_STACK      (PT_LOOS + 0x14)
#define PT_PARISC_ARCHEXT      0x70000000
#define PT_PARISC_UNWIND      0x70000001
/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr.*/
#define PF_PARISC_SBP      0x08000000
#define PF_HP_PAGE_SIZE      0x00100000
#define PF_HP_FAR_SHARED      0x00200000
#define PF_HP_NEAR_SHARED      0x00400000
#define PF_HP_CODE      0x01000000
#define PF_HP_MODIFY      0x02000000
#define PF_HP_LAZYSWAP      0x04000000
#define PF_HP_SBP      0x08000000
/* IA-64 specific declarations.*/
/* Processor specific flags for the Ehdr e_flags field.*/
#define EF_IA_64_MASKOS      0x0000000f      /* os-specific flags */
#define EF_IA_64_ABI64      0x00000010      /* 64-bit ABI */
#define EF_IA_64_ARCH      0xff000000      /* arch. version mask */
/* Processor specific values for the Phdr p_type field.*/
#define PT_IA_64_ARCHEXT      (PT_LOPROC + 0)      /* arch extension bits */
#define PT_IA_64_UNWIND      (PT_LOPROC + 1)      /* ia64 unwind bits */
/* Processor specific flags for the Phdr p_flags field.*/
#define PF_IA_64_NORECOV      0x80000000      /* spec insns w/o recovery */
/* Processor specific values for the Shdr sh_type field.*/
#define SHT_IA_64_EXT      (SHT_LOPROC + 0) /* extension bits */
#define SHT_IA_64_UNWIND      (SHT_LOPROC + 1) /* unwind bits */
/* Processor specific flags for the Shdr sh_flags field.*/
#define SHF_IA_64_SHORT      0x10000000      /* section near gp */
#define SHF_IA_64_NORECOV      0x20000000      /* spec insns w/o recovery */
/* Processor specific values for the Dyn d_tag field.*/
#define DT_IA_64_PLT_RESERVE      (DT_LOPROC + 0)
#define DT_IA_64_NUM      1
/* IA-64 relocations.*/
#define R_IA64_NONE      0x00      /* none */
#define R_IA64_IMM14      0x21      /* symbol + addend, add imm14 */
#define R_IA64_IMM22      0x22      /* symbol + addend, add imm22 */
#define R_IA64_IMM64      0x23      /* symbol + addend, mov imm64 */
#define R_IA64_DIR32MSB      0x24      /* symbol + addend, data4 MSB */
#define R_IA64_DIR32LSB      0x25      /* symbol + addend, data4 LSB */
#define R_IA64_DIR64MSB      0x26      /* symbol + addend, data8 MSB */
#define R_IA64_DIR64LSB      0x27      /* symbol + addend, data8 LSB */
#define R_IA64_GPREL22      0x2a      /* @gprel(sym + add), add imm22 */
#define R_IA64_GPREL64I      0x2b      /* @gprel(sym + add), mov imm64 */
#define R_IA64_GPREL32MSB      0x2c      /* @gprel(sym + add), data4 MSB */
#define R_IA64_GPREL32LSB      0x2d      /* @gprel(sym + add), data4 LSB */
#define R_IA64_GPREL64MSB      0x2e      /* @gprel(sym + add), data8 MSB */
#define R_IA64_GPREL64LSB      0x2f      /* @gprel(sym + add), data8 LSB */
#define R_IA64_LTOFF22      0x32      /* @ltoff(sym + add), add imm22 */
#define R_IA64_LTOFF64I      0x33      /* @ltoff(sym + add), mov imm64 */
#define R_IA64_PLTOFF22      0x3a      /* @pltoff(sym + add), add imm22 */
#define R_IA64_PLTOFF64I      0x3b      /* @pltoff(sym + add), mov imm64 */
#define R_IA64_PLTOFF64MSB      0x3e      /* @pltoff(sym + add), data8 MSB */
#define R_IA64_PLTOFF64LSB      0x3f      /* @pltoff(sym + add), data8 LSB */
#define R_IA64_FPTR64I      0x43      /* @fptr(sym + add), mov imm64 */
#define R_IA64_FPTR32MSB      0x44      /* @fptr(sym + add), data4 MSB */
#define R_IA64_FPTR32LSB      0x45      /* @fptr(sym + add), data4 LSB */
#define R_IA64_FPTR64MSB      0x46      /* @fptr(sym + add), data8 MSB */
#define R_IA64_FPTR64LSB      0x47      /* @fptr(sym + add), data8 LSB */
#define R_IA64_PCREL60B      0x48      /* @pcrel(sym + add), brl */
#define R_IA64_PCREL21B      0x49      /* @pcrel(sym + add), ptb, call */
#define R_IA64_PCREL21M      0x4a      /* @pcrel(sym + add), chk.s */
#define R_IA64_PCREL21F      0x4b      /* @pcrel(sym + add), fchkf */
#define R_IA64_PCREL32MSB      0x4c      /* @pcrel(sym + add), data4 MSB */
#define R_IA64_PCREL32LSB      0x4d      /* @pcrel(sym + add), data4 LSB */
#define R_IA64_PCREL64MSB      0x4e      /* @pcrel(sym + add), data8 MSB */
#define R_IA64_PCREL64LSB      0x4f      /* @pcrel(sym + add), data8 LSB */
#define R_IA64_LTOFF_FPTR22      0x52      /* @ltoff(@fptr(s+a)), imm22 */
#define R_IA64_LTOFF_FPTR64I      0x53      /* @ltoff(@fptr(s+a)), imm64 */
#define R_IA64_LTOFF_FPTR32MSB      0x54      /* @ltoff(@fptr(s+a)), data4 MSB */
#define R_IA64_LTOFF_FPTR32LSB      0x55      /* @ltoff(@fptr(s+a)), data4 LSB */
#define R_IA64_LTOFF_FPTR64MSB      0x56      /* @ltoff(@fptr(s+a)), data8 MSB */
#define R_IA64_LTOFF_FPTR64LSB      0x57      /* @ltoff(@fptr(s+a)), data8 LSB */
#define R_IA64_SEGREL32MSB      0x5c      /* @segrel(sym + add), data4 MSB */
#define R_IA64_SEGREL32LSB      0x5d      /* @segrel(sym + add), data4 LSB */
#define R_IA64_SEGREL64MSB      0x5e      /* @segrel(sym + add), data8 MSB */
#define R_IA64_SEGREL64LSB      0x5f      /* @segrel(sym + add), data8 LSB */
#define R_IA64_SECREL32MSB      0x64      /* @secrel(sym + add), data4 MSB */
#define R_IA64_SECREL32LSB      0x65      /* @secrel(sym + add), data4 LSB */
#define R_IA64_SECREL64MSB      0x66      /* @secrel(sym + add), data8 MSB */
#define R_IA64_SECREL64LSB      0x67      /* @secrel(sym + add), data8 LSB */
#define R_IA64_REL32MSB      0x6c      /* data 4 + REL */
#define R_IA64_REL32LSB      0x6d      /* data 4 + REL */
#define R_IA64_REL64MSB      0x6e      /* data 8 + REL */
#define R_IA64_REL64LSB      0x6f      /* data 8 + REL */
#define R_IA64_LTV32MSB      0x74      /* symbol + addend, data4 MSB */
#define R_IA64_LTV32LSB      0x75      /* symbol + addend, data4 LSB */
#define R_IA64_LTV64MSB      0x76      /* symbol + addend, data8 MSB */
#define R_IA64_LTV64LSB      0x77      /* symbol + addend, data8 LSB */
#define R_IA64_PCREL21BI      0x79      /* @pcrel(sym + add), 21bit inst */
#define R_IA64_PCREL22      0x7a      /* @pcrel(sym + add), 22bit inst */
#define R_IA64_PCREL64I      0x7b      /* @pcrel(sym + add), 64bit inst */
#define R_IA64_IPLTMSB      0x80      /* dynamic reloc, imported PLT, MSB */
#define R_IA64_IPLTLSB      0x81      /* dynamic reloc, imported PLT, LSB */
#define R_IA64_COPY      0x84      /* copy relocation */
#define R_IA64_SUB      0x85      /* Addend and symbol difference */
#define R_IA64_LTOFF22X      0x86      /* LTOFF22, relaxable.*/
#define R_IA64_LDXMOV      0x87      /* Use of LTOFF22X.*/
#define R_IA64_TPREL14      0x91      /* @tprel(sym + add), imm14 */
#define R_IA64_TPREL22      0x92      /* @tprel(sym + add), imm22 */
#define R_IA64_TPREL64I      0x93      /* @tprel(sym + add), imm64 */
#define R_IA64_TPREL64MSB      0x96      /* @tprel(sym + add), data8 MSB */
#define R_IA64_TPREL64LSB      0x97      /* @tprel(sym + add), data8 LSB */
#define R_IA64_LTOFF_TPREL22      0x9a      /* @ltoff(@tprel(s+a)), imm2 */
#define R_IA64_DTPMOD64MSB      0xa6      /* @dtpmod(sym + add), data8 MSB */
#define R_IA64_DTPMOD64LSB      0xa7      /* @dtpmod(sym + add), data8 LSB */
#define R_IA64_LTOFF_DTPMOD22      0xaa      /* @ltoff(@dtpmod(sym + add)), imm22 */
#define R_IA64_DTPREL14      0xb1      /* @dtprel(sym + add), imm14 */
#define R_IA64_DTPREL22      0xb2      /* @dtprel(sym + add), imm22 */
#define R_IA64_DTPREL64I      0xb3      /* @dtprel(sym + add), imm64 */
#define R_IA64_DTPREL32MSB      0xb4      /* @dtprel(sym + add), data4 MSB */
#define R_IA64_DTPREL32LSB      0xb5      /* @dtprel(sym + add), data4 LSB */
#define R_IA64_DTPREL64MSB      0xb6      /* @dtprel(sym + add), data8 MSB */
#define R_IA64_DTPREL64LSB      0xb7      /* @dtprel(sym + add), data8 LSB */
#define R_IA64_LTOFF_DTPREL22      0xba      /* @ltoff(@dtprel(s+a)), imm22 */
typedef struct elf32_rel {
Elf32_Addr      r_offset;
Elf32_Word      r_info;
} Elf32_Rel;
typedef struct elf64_rel {
Elf64_Addr r_offset;      /* Location at which to apply the action */
Elf64_Xword r_info;      /* index and type of relocation */
} Elf64_Rel;
typedef struct elf32_rela{
Elf32_Addr      r_offset;
Elf32_Word      r_info;
Elf32_Sword      r_addend;
} Elf32_Rela;
typedef struct elf64_rela {
Elf64_Addr r_offset;      /* Location at which to apply the action */
Elf64_Xword r_info;      /* index and type of relocation */
Elf64_Sxword r_addend;      /* Constant addend used to compute value */
} Elf64_Rela;
typedef struct elf32_sym{
Elf32_Word      st_name;
Elf32_Addr      st_value;
Elf32_Word      st_size;
unsigned char      st_info;
unsigned char      st_other;
Elf32_Half      st_shndx;
} Elf32_Sym;
typedef struct elf64_sym {
Elf64_Word st_name;      /* Symbol name, index in string tbl */
unsigned char      st_info;      /* Type and binding attributes */
unsigned char      st_other;      /* No defined meaning, 0 */
Elf64_Half st_shndx;      /* Associated section index */
Elf64_Addr st_value;      /* Value of the symbol */
Elf64_Xword st_size;      /* Associated symbol size */
} Elf64_Sym;
#define EI_NIDENT      16
typedef struct elf32_hdr{
unsigned char      e_ident;
Elf32_Half      e_type;
Elf32_Half      e_machine;
Elf32_Word      e_version;
Elf32_Addr      e_entry;/* Entry point */
Elf32_Off      e_phoff;
Elf32_Off      e_shoff;
Elf32_Word      e_flags;
Elf32_Half      e_ehsize;
Elf32_Half      e_phentsize;
Elf32_Half      e_phnum;
Elf32_Half      e_shentsize;
Elf32_Half      e_shnum;
Elf32_Half      e_shstrndx;
} Elf32_Ehdr;
typedef struct elf64_hdr {
unsigned char      e_ident;      /* ELF "magic number" */
Elf64_Half e_type;
Elf64_Half e_machine;
Elf64_Word e_version;
Elf64_Addr e_entry;      /* Entry point virtual address */
Elf64_Off e_phoff;      /* Program header table file offset */
Elf64_Off e_shoff;      /* Section header table file offset */
Elf64_Word e_flags;
Elf64_Half e_ehsize;
Elf64_Half e_phentsize;
Elf64_Half e_phnum;
Elf64_Half e_shentsize;
Elf64_Half e_shnum;
Elf64_Half e_shstrndx;
} Elf64_Ehdr;
/* These constants define the permissions on sections in the program
   header, p_flags. */
#define PF_R      0x4
#define PF_W      0x2
#define PF_X      0x1
typedef struct elf32_phdr{
Elf32_Word      p_type;
Elf32_Off      p_offset;
Elf32_Addr      p_vaddr;
Elf32_Addr      p_paddr;
Elf32_Word      p_filesz;
Elf32_Word      p_memsz;
Elf32_Word      p_flags;
Elf32_Word      p_align;
} Elf32_Phdr;
typedef struct elf64_phdr {
Elf64_Word p_type;
Elf64_Word p_flags;
Elf64_Off p_offset;      /* Segment file offset */
Elf64_Addr p_vaddr;      /* Segment virtual address */
Elf64_Addr p_paddr;      /* Segment physical address */
Elf64_Xword p_filesz;      /* Segment size in file */
Elf64_Xword p_memsz;      /* Segment size in memory */
Elf64_Xword p_align;      /* Segment alignment, file & memory */
} Elf64_Phdr;
/* sh_type */
#define SHT_NULL      0
#define SHT_PROGBITS      1
#define SHT_SYMTAB      2
#define SHT_STRTAB      3
#define SHT_RELA      4
#define SHT_HASH      5
#define SHT_DYNAMIC      6
#define SHT_NOTE      7
#define SHT_NOBITS      8
#define SHT_REL      9
#define SHT_SHLIB      10
#define SHT_DYNSYM      11
#define SHT_NUM      12
#define SHT_LOPROC      0x70000000
#define SHT_HIPROC      0x7fffffff
#define SHT_LOUSER      0x80000000
#define SHT_HIUSER      0xffffffff
#define SHT_MIPS_LIST      0x70000000
#define SHT_MIPS_CONFLICT      0x70000002
#define SHT_MIPS_GPTAB      0x70000003
#define SHT_MIPS_UCODE      0x70000004
/* sh_flags */
#define SHF_WRITE      0x1
#define SHF_ALLOC      0x2
#define SHF_EXECINSTR      0x4
#define SHF_MASKPROC      0xf0000000
#define SHF_MIPS_GPREL      0x10000000
/* special section indexes */
#define SHN_UNDEF      0
#define SHN_LORESERVE      0xff00
#define SHN_LOPROC      0xff00
#define SHN_HIPROC      0xff1f
#define SHN_ABS      0xfff1
#define SHN_COMMON      0xfff2
#define SHN_HIRESERVE      0xffff
#define SHN_MIPS_ACCOMON      0xff00
typedef struct elf32_shdr {
Elf32_Word      sh_name;
Elf32_Word      sh_type;
Elf32_Word      sh_flags;
Elf32_Addr      sh_addr;
Elf32_Off      sh_offset;
Elf32_Word      sh_size;
Elf32_Word      sh_link;
Elf32_Word      sh_info;
Elf32_Word      sh_addralign;
Elf32_Word      sh_entsize;
} Elf32_Shdr;
typedef struct elf64_shdr {
Elf64_Word sh_name;      /* Section name, index in string tbl */
Elf64_Word sh_type;      /* Type of section */
Elf64_Xword sh_flags;      /* Miscellaneous section attributes */
Elf64_Addr sh_addr;      /* Section virtual addr at execution */
Elf64_Off sh_offset;      /* Section file offset */
Elf64_Xword sh_size;      /* Size of section in bytes */
Elf64_Word sh_link;      /* Index of another section */
Elf64_Word sh_info;      /* Additional section information */
Elf64_Xword sh_addralign;      /* Section alignment */
Elf64_Xword sh_entsize;      /* Entry size if section holds table */
} Elf64_Shdr;
#define      EI_MAG0      0      /* e_ident[] indexes */
#define      EI_MAG1      1
#define      EI_MAG2      2
#define      EI_MAG3      3
#define      EI_CLASS      4
#define      EI_DATA      5
#define      EI_VERSION      6
#define      EI_PAD      7
#define      ELFMAG0      0x7f      /* EI_MAG */
#define      ELFMAG1      'E'
#define      ELFMAG2      'L'
#define      ELFMAG3      'F'
#define      ELFMAG      "177ELF"
#define      SELFMAG      4
#define      ELFCLASSNONE      0      /* EI_CLASS */
#define      ELFCLASS32      1
#define      ELFCLASS64      2
#define      ELFCLASSNUM      3
#define ELFDATANONE      0      /* e_ident */
#define ELFDATA2LSB      1
#define ELFDATA2MSB      2
#define EV_NONE      0      /* e_version, EI_VERSION */
#define EV_CURRENT      1
#define EV_NUM      2
/* Notes used in ET_CORE */
#define NT_PRSTATUS      1
#define NT_PRFPREG      2
#define NT_PRPSINFO      3
#define NT_TASKSTRUCT      4
#define NT_PRXFPREG   0x46e62b7f      /* copied from gdb5.1/include/elf/common.h */
/* Note header in a PT_NOTE section */
typedef struct elf32_note {
Elf32_Word      n_namesz;      /* Name size */
Elf32_Word      n_descsz;      /* Content size */
Elf32_Word      n_type;      /* Content type */
} Elf32_Nhdr;
/* Note header in a PT_NOTE section */
typedef struct elf64_note {
Elf64_Word n_namesz;      /* Name size */
Elf64_Word n_descsz;      /* Content size */
Elf64_Word n_type;      /* Content type */
} Elf64_Nhdr;
#if ELF_CLASS == ELFCLASS32
#define elfhdr      elf32_hdr
#define elf_phdr      elf32_phdr
#define elf_note      elf32_note
#define elf_shdr      elf32_shdr
#define elf_sym      elf32_sym
#define elf_addr_t      Elf32_Off
#ifdef ELF_USES_RELOCA
# define ELF_RELOC      Elf32_Rela
#else
# define ELF_RELOC      Elf32_Rel
#endif
#else
#define elfhdr      elf64_hdr
#define elf_phdr      elf64_phdr
#define elf_note      elf64_note
#define elf_shdr      elf64_shdr
#define elf_sym      elf64_sym
#define elf_addr_t      Elf64_Off
#ifdef ELF_USES_RELOCA
# define ELF_RELOC      Elf64_Rela
#else
# define ELF_RELOC      Elf64_Rel
#endif
#endif /* ELF_CLASS */
#ifndef ElfW
# if ELF_CLASS == ELFCLASS32
#define ElfW(x)Elf32_ ## x
#define ELFW(x)ELF32_ ## x
# else
#define ElfW(x)Elf64_ ## x
#define ELFW(x)ELF64_ ## x
# endif
#endif
#endif /* _QEMU_ELF_H */


--------------------------------------------------------------------
8月29日 修改了一些bug,主要是因为shdr.sh_type赋值错误,导致函数名不能正常解析,对细节进行了一些修改,目前这个版本基本上和ThomasKing大大的工具一样了,希望大家喜欢

藿香正气 发表于 2017-5-12 13:47

本帖最后由 藿香正气 于 2017-5-12 16:25 编辑

Thunderbolt 发表于 2017-5-12 10:19
教你个超级不要脸的绝招,你把TM的apk逆向一下不就都有了
不太理解什么意思 能不能帮我详细解释一下

藿香正气 发表于 2017-10-25 09:22

51bwn 发表于 2017-10-24 10:27
如何修改方法名呢,我直接修改是不行的,系统的学习是有多麻烦呀。

应该在导出表里可以修改

欧阳锋锋 发表于 2017-5-11 15:50

沙发,楼主可以{:1_921:}

mayl8822 发表于 2017-5-11 15:52

感谢分享!!!

caddy 发表于 2017-5-11 16:40

谢谢分享

fatmou 发表于 2017-5-11 16:45

大神啊, 先看看,学习一下

hnguoxia 发表于 2017-5-11 17:10

学习了,谢谢大神!!

悠悠娴娴 发表于 2017-5-11 19:43

大神,接受我的膜拜

meng4450 发表于 2017-5-11 20:10


大神,学习一下

superlukia 发表于 2017-5-12 09:42

学习了,感谢分享

藿香正气 发表于 2017-5-12 09:49

谢谢各位大大支持,第一次写这样的文章,写的不好代码也没有注释希望大家包涵,有什么问题也可以和我交流
页: [1] 2 3
查看完整版本: ELF文件格式学习,ELF section修复