ELF文件格式学习,section修复


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..text..ARM.extab..ARM.exidx..fini_array..init_array..dynamic..got..data..bass..shstrtab\0";
char* str1 = "..dynsym\0.dynstr\0.hash\0.rel.dyn\0.rel.plt\0.text\0.ARM.extab\0.ARM.exidx\0.fini_array\0.init_array\0.dynamic\0.got\0.data\0.bass\0.shstrtab\0";
Elf32_Shdr shdr[SHDRS] = { 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,
        char** sh_buffer, int sh_len)
{
        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;
 
        memset(*sh_buffer, 0, sh_len);
 
        i = 0;
        for(;i < ph_num;i++) {
                if (phdr[i].p_type == PT_LOAD) {
                        if (phdr[i].p_vaddr > 0x0) {
                                load = phdr[i];
                                shdr[BSS].sh_name = strstr(str,".bss") - str;
                                shdr[BSS].sh_type = SHT_NOBITS;
                                shdr[BSS].sh_flags = SHF_WRITE | SHF_ALLOC;
                                shdr[BSS].sh_addr =  phdr[i].p_vaddr + phdr[i].p_filesz;
                                shdr[BSS].sh_offset = shdr[BSS].sh_addr - 0x1000;
                                shdr[BSS].sh_addralign = 1;
                                continue;
                        }
                }
 
                if(phdr[i].p_type == PT_DYNAMIC) {
                        shdr[DYNAMIC].sh_name = strstr(str, ".dynamic") - str;
                        shdr[DYNAMIC].sh_type = SHT_DYNAMIC;
                        shdr[DYNAMIC].sh_flags = SHF_WRITE | SHF_ALLOC;
                        shdr[DYNAMIC].sh_addr = phdr[i].p_vaddr;
                        shdr[DYNAMIC].sh_offset = phdr[i].p_offset;
                        shdr[DYNAMIC].sh_size = phdr[i].p_filesz;
                        shdr[DYNAMIC].sh_link = 2;
                        shdr[DYNAMIC].sh_info = 0;
                        shdr[DYNAMIC].sh_addralign = 4;
                        shdr[DYNAMIC].sh_entsize = 8;
                        dyn_size = phdr[i].p_filesz;
                    dyn_off = phdr[i].p_offset;
                    continue;
                }
 
                if(phdr[i].p_type == PT_LOPROC || phdr[i].p_type == PT_LOPROC + 1) {
                        shdr[ARMEXIDX].sh_name = strstr(str, ".ARM.exidx") - str;
                        shdr[ARMEXIDX].sh_type = SHT_LOPROC;
                        shdr[ARMEXIDX].sh_flags = SHF_ALLOC;
                        shdr[ARMEXIDX].sh_addr = phdr[i].p_vaddr;
                        shdr[ARMEXIDX].sh_offset = phdr[i].p_offset;
                        shdr[ARMEXIDX].sh_size = phdr[i].p_filesz;
                        shdr[ARMEXIDX].sh_link = 7;
                        shdr[ARMEXIDX].sh_info = 0;
                        shdr[ARMEXIDX].sh_addralign = 4;
                        shdr[ARMEXIDX].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[i].d_tag) {
                        case DT_SYMTAB:
                                shdr[DYNSYM].sh_name = strstr(str, ".dynsym") - str;
                                shdr[DYNSYM].sh_type = SHT_DYNSYM;
                                shdr[DYNSYM].sh_flags = SHF_ALLOC;
                                shdr[DYNSYM].sh_addr = dyn[i].d_un.d_ptr;
                                shdr[DYNSYM].sh_offset = dyn[i].d_un.d_ptr;
                                shdr[DYNSYM].sh_link = 2;
                                shdr[DYNSYM].sh_info = 1;
                                shdr[DYNSYM].sh_addralign = 4;
                                shdr[DYNSYM].sh_entsize = 16;
                                break;
 
                        case DT_STRTAB:
                                shdr[DYNSTR].sh_name = strstr(str, ".dynstr") - str;
                                shdr[DYNSTR].sh_type = SHT_STRTAB;
                                shdr[DYNSTR].sh_flags = SHF_ALLOC;
                                shdr[DYNSTR].sh_offset = dyn[i].d_un.d_ptr;
                                shdr[DYNSTR].sh_addr = dyn[i].d_un.d_ptr;
                                shdr[DYNSTR].sh_addralign = 1;
                                shdr[DYNSTR].sh_entsize = 0;
                                break;
 
                        case DT_HASH:
                                shdr[HASH].sh_name = strstr(str, ".hash") - str;
                                shdr[HASH].sh_type = SHT_HASH;
                                shdr[HASH].sh_flags = SHF_ALLOC;
                                shdr[HASH].sh_addr = dyn[i].d_un.d_ptr;
                                shdr[HASH].sh_offset = dyn[i].d_un.d_ptr;
                                memcpy(&nbucket, buffer + shdr[HASH].sh_offset, 4);
                                memcpy(&nchain, buffer + shdr[HASH].sh_offset + 4, 4);
                                shdr[HASH].sh_size = (nbucket + nchain + 2) * sizeof(int);
                                shdr[HASH].sh_link = 4;
                                shdr[HASH].sh_info = 1;
                                shdr[HASH].sh_addralign = 4;
                                shdr[HASH].sh_entsize = 4;        
                                break;
 
                        case DT_REL:
                                shdr[RELDYN].sh_name = strstr(str, ".rel.dyn") - str;
                                shdr[RELDYN].sh_type = SHT_REL;
                                shdr[RELDYN].sh_flags = SHF_ALLOC;
                                shdr[RELDYN].sh_addr = dyn[i].d_un.d_ptr;
                                shdr[RELDYN].sh_offset = dyn[i].d_un.d_ptr;
                                shdr[RELDYN].sh_link = 4;
                                shdr[RELDYN].sh_info = 0;
                                shdr[RELDYN].sh_addralign = 4;
                                shdr[RELDYN].sh_entsize = 8;
                                break;
 
                        case DT_JMPREL:
                                shdr[RELPLT].sh_name = strstr(str, ".rel.plt") - str;
                                shdr[RELPLT].sh_type = SHT_PROGBITS;
                                shdr[RELPLT].sh_flags = SHF_ALLOC;
                                shdr[RELPLT].sh_addr = dyn[i].d_un.d_ptr;
                                shdr[RELPLT].sh_offset = dyn[i].d_un.d_ptr;
                                shdr[RELPLT].sh_link = 1;
                                shdr[RELPLT].sh_info = 6;
                                shdr[RELPLT].sh_addralign = 4;
                                shdr[RELPLT].sh_entsize = 8;
                                break;
 
                        case DT_PLTRELSZ:
                                shdr[RELPLT].sh_size = dyn[i].d_un.d_val;
                                break;
 
                        case DT_FINI:
                                shdr[FINIARRAY].sh_name = strstr(str, ".fini_array") - str;
                                shdr[FINIARRAY].sh_type = 15;
                                shdr[FINIARRAY].sh_flags = SHF_WRITE | SHF_ALLOC;
                                shdr[FINIARRAY].sh_offset = dyn[i].d_un.d_ptr - 0x1000;
                                shdr[FINIARRAY].sh_addr = dyn[i].d_un.d_ptr;
                                shdr[FINIARRAY].sh_addralign = 4;
                                shdr[FINIARRAY].sh_entsize = 0;
                                break;
 
                        case DT_INIT:
                                shdr[INITARRAY].sh_name = strstr(str, ".init_array") - str;
                                shdr[INITARRAY].sh_type = 14;
                                shdr[INITARRAY].sh_flags = SHF_WRITE | SHF_ALLOC;
                                shdr[INITARRAY].sh_offset = dyn[i].d_un.d_ptr - 0x1000;
                                shdr[INITARRAY].sh_addr = dyn[i].d_un.d_ptr;
                                shdr[INITARRAY].sh_addralign = 4;
                                shdr[INITARRAY].sh_entsize = 0;
                                break;
 
                        case DT_RELSZ:
                                shdr[RELDYN].sh_size = dyn[i].d_un.d_val;
                                break;
                         
                        case DT_STRSZ:
                                shdr[DYNSTR].sh_size = dyn[i].d_un.d_val;
                                break;
 
                        case DT_PLTGOT:
                                shdr[GOT].sh_name = strstr(str, ".got") - str;
                                shdr[GOT].sh_type = SHT_PROGBITS;
                                shdr[GOT].sh_flags = SHF_WRITE | SHF_ALLOC; 
                                shdr[GOT].sh_addr = shdr[DYNAMIC].sh_addr + shdr[DYNAMIC].sh_size;
                                shdr[GOT].sh_offset = shdr[GOT].sh_addr - 0x1000;
                                shdr[GOT].sh_size = dyn[i].d_un.d_ptr;
                                shdr[GOT].sh_addralign = 4;
                                break;
                }
        }
        shdr[GOT].sh_size = shdr[GOT].sh_size + 4 * (shdr[RELPLT].sh_size) / sizeof(Elf32_Rel) + 3 * sizeof(int) - shdr[GOT].sh_addr;
 
        //STRTAB地址 - SYMTAB地址 = SYMTAB大小
        shdr[DYNSYM].sh_size = shdr[DYNSTR].sh_addr - shdr[DYNSYM].sh_addr;
 
        shdr[FINIARRAY].sh_size = shdr[INITARRAY].sh_addr - shdr[FINIARRAY].sh_addr;
        shdr[INITARRAY].sh_size = shdr[DYNAMIC].sh_addr - shdr[INITARRAY].sh_addr;
         
        shdr[PLT].sh_name = strstr(str, ".plt") - str;
        shdr[PLT].sh_type = SHT_PROGBITS;
        shdr[PLT].sh_flags = SHF_ALLOC | SHF_EXECINSTR;
        shdr[PLT].sh_addr = shdr[RELPLT].sh_addr + shdr[RELPLT].sh_size;
        shdr[PLT].sh_offset = shdr[PLT].sh_addr;
        shdr[PLT].sh_size = (20 + 12 * (shdr[RELPLT].sh_size) / sizeof(Elf32_Rel));
        shdr[PLT].sh_addralign = 4;
 
        shdr[TEXT].sh_name = strstr(str, ".text") - str;
        shdr[TEXT].sh_type = SHT_PROGBITS;
        shdr[TEXT].sh_flags = SHF_ALLOC | SHF_EXECINSTR;
        shdr[TEXT].sh_addr = shdr[PLT].sh_addr + shdr[PLT].sh_size;
        shdr[TEXT].sh_offset = shdr[TEXT].sh_addr;
        shdr[TEXT].sh_size = shdr[ARMEXIDX].sh_addr - shdr[TEXT].sh_addr;
         
        shdr[DATA].sh_name = strstr(str, ".data") - str;
        shdr[DATA].sh_type = SHT_PROGBITS;
        shdr[DATA].sh_flags = SHF_WRITE | SHF_ALLOC;
        shdr[DATA].sh_addr = shdr[GOT].sh_addr + shdr[GOT].sh_size;
        shdr[DATA].sh_offset = shdr[DATA].sh_addr - 0x1000;
        shdr[DATA].sh_size = load.p_vaddr + load.p_filesz - shdr[DATA].sh_addr;
        shdr[DATA].sh_addralign = 4;
 
        shdr[STRTAB].sh_name = strstr(str, ".shstrtab") - str;
        shdr[STRTAB].sh_type = SHT_STRTAB;
        shdr[STRTAB].sh_flags = SHT_NULL;
        shdr[STRTAB].sh_addr = 0;
        shdr[STRTAB].sh_offset = shdr[BSS].sh_addr - 0x1000;
        shdr[STRTAB].sh_size = strlen(str) + 1;
        shdr[STRTAB].sh_addralign = 1;
        //memcpy(buffer + shdr[STRTAB].sh_offset, str, strlen(str));
        memcpy(*sh_buffer,shdr,sizeof(shdr));        
}
 
int main(int argc, char const *argv[])
{
        FILE* fr = NULL;
        long flen = 0;
        FILE* fw = NULL;
        int ph_len = 0;
        char* buffer = NULL;
        char* sh_buffer = NULL;
        Elf32_Ehdr *pehdr = NULL;
        Elf32_Phdr* pphdr = NULL;
        char arr[2048] = { 0 };
        if (argc < 2) {
                printf("less args\n");
                return;
        }
 
        fr = fopen(argv[1],"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;
        }
 
        size_t 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);
 
        ph_len = pehdr->e_phentsize * pehdr->e_phnum;
        pphdr = (Elf32_Phdr*)malloc(ph_len);
        get_program_table(*pehdr,buffer,&pphdr);
 
        sh_buffer = (char* )malloc(pehdr->e_shentsize * pehdr->e_shnum);
        get_Info(pphdr, pehdr, buffer, &sh_buffer, pehdr->e_shentsize * pehdr->e_shnum);
         
        memcpy(buffer + pehdr->e_shoff,sh_buffer,pehdr->e_shentsize * pehdr->e_shnum);
        pehdr->e_shnum = SHDRS;
        pehdr->e_shstrndx = SHDRS - 1;
        memcpy(buffer, pehdr, sizeof(Elf32_Ehdr));
        memcpy(buffer + shdr[STRTAB].sh_offset, str1, strlen(str) + 1);
        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_t  Elf32_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_t  Elf64_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_INTERP  3
#define PT_NOTE    4
#define PT_SHLIB   5
#define PT_PHDR    6
#define PT_LOPROC  0x70000000
#define PT_HIPROC  0x7fffffff
#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_NONE  0
#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_LOCAL  0
#define STB_GLOBAL 1
#define STB_WEAK   2
#define STT_NOTYPE  0
#define STT_OBJECT  1
#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_PHENT  4        /* size of program header entry */
#define AT_PHNUM  5        /* number of program headers */
#define AT_PAGESZ 6        /* system page size */
#define AT_BASE   7        /* base address of interpreter */
#define AT_FLAGS  8        /* flags */
#define AT_ENTRY  9        /* 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_HWCAP  16    /* 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_FLOAT  0x10
#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_ENTRYSECT  0x10000000   /* 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[EI_NIDENT];
  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[16];        /* 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[EI_DATA] */
#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 */
完整的代码可以在这里下载 github: https://github.com/WangYinuo/FixElfSection


这里小弟也写了一个内存dump工具

github:https://github.com/WangYinuo/MemDump

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值