URI:
       telf.h - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       telf.h (4524B)
       ---
            1 /*
            2  * Copyright (c) 2004 Russ Cox.  See LICENSE.
            3  */
            4 
            5 /* /home/rsc/papers/elfXXelf.pdf */
            6 
            7 typedef struct Elf Elf;
            8 typedef struct ElfHdr ElfHdr;
            9 typedef struct ElfSect ElfSect;
           10 typedef struct ElfProg ElfProg;
           11 typedef struct ElfNote ElfNote;
           12 typedef struct ElfSym ElfSym;
           13 
           14 enum
           15 {
           16         ElfClassNone = 0,
           17         ElfClass32,
           18         ElfClass64,
           19 
           20         ElfDataNone = 0,
           21         ElfDataLsb,
           22         ElfDataMsb,
           23 
           24         ElfTypeNone = 0,
           25         ElfTypeRelocatable,
           26         ElfTypeExecutable,
           27         ElfTypeSharedObject,
           28         ElfTypeCore,
           29         /* 0xFF00 - 0xFFFF reserved for processor-specific types */
           30 
           31         ElfMachNone = 0,
           32         ElfMach32100,                /* AT&T WE 32100 */
           33         ElfMachSparc,                /* SPARC */
           34         ElfMach386,                /* Intel 80386 */
           35         ElfMach68000,                /* Motorola 68000 */
           36         ElfMach88000,                /* Motorola 88000 */
           37         ElfMach486,                /* Intel 80486, no longer used */
           38         ElfMach860,                /* Intel 80860 */
           39         ElfMachMips,                /* MIPS RS3000 */
           40         ElfMachS370,                /* IBM System/370 */
           41         ElfMachMipsLe,        /* MIPS RS3000 LE */
           42         ElfMachParisc = 15,                /* HP PA RISC */
           43         ElfMachVpp500 = 17,        /* Fujitsu VPP500 */
           44         ElfMachSparc32Plus,        /* SPARC V8+ */
           45         ElfMach960,                /* Intel 80960 */
           46         ElfMachPower,                /* PowerPC */
           47         ElfMachPower64,        /* PowerPC 64 */
           48         ElfMachS390,                /* IBM System/390 */
           49         ElfMachV800 = 36,        /* NEC V800 */
           50         ElfMachFr20,                /* Fujitsu FR20 */
           51         ElfMachRh32,                /* TRW RH-32 */
           52         ElfMachRce,                /* Motorola RCE */
           53         ElfMachArm,                /* ARM */
           54         ElfMachAlpha,                /* Digital Alpha */
           55         ElfMachSH,                /* Hitachi SH */
           56         ElfMachSparc9,                /* SPARC V9 */
           57         ElfMachAmd64 = 62,        /* x86-64 */
           58         /* and the list goes on... */
           59 
           60         ElfAbiNone = 0,
           61         ElfAbiSystemV = 0,        /* [sic] */
           62         ElfAbiHPUX,
           63         ElfAbiNetBSD,
           64         ElfAbiLinux,
           65         ElfAbiSolaris = 6,
           66         ElfAbiAix,
           67         ElfAbiIrix,
           68         ElfAbiFreeBSD,
           69         ElfAbiTru64,
           70         ElfAbiModesto,
           71         ElfAbiOpenBSD,
           72         ElfAbiARM = 97,
           73         ElfAbiEmbedded = 255,
           74 
           75         /* some of sections 0xFF00 - 0xFFFF reserved for various things */
           76         ElfSectNone = 0,
           77         ElfSectProgbits,
           78         ElfSectSymtab,
           79         ElfSectStrtab,
           80         ElfSectRela,
           81         ElfSectHash,
           82         ElfSectDynamic,
           83         ElfSectNote,
           84         ElfSectNobits,
           85         ElfSectRel,
           86         ElfSectShlib,
           87         ElfSectDynsym,
           88 
           89         ElfSectFlagWrite = 0x1,
           90         ElfSectFlagAlloc = 0x2,
           91         ElfSectFlagExec = 0x4,
           92         /* 0xF0000000 are reserved for processor specific */
           93 
           94         ElfSymBindLocal = 0,
           95         ElfSymBindGlobal,
           96         ElfSymBindWeak,
           97         /* 13-15 reserved */
           98 
           99         ElfSymTypeNone = 0,
          100         ElfSymTypeObject,
          101         ElfSymTypeFunc,
          102         ElfSymTypeSection,
          103         ElfSymTypeFile,
          104         /* 13-15 reserved */
          105 
          106         ElfSymShnNone = 0,
          107         ElfSymShnAbs = 0xFFF1,
          108         ElfSymShnCommon = 0xFFF2,
          109         /* 0xFF00-0xFF1F reserved for processors */
          110         /* 0xFF20-0xFF3F reserved for operating systems */
          111 
          112         ElfProgNone = 0,
          113         ElfProgLoad,
          114         ElfProgDynamic,
          115         ElfProgInterp,
          116         ElfProgNote,
          117         ElfProgShlib,
          118         ElfProgPhdr,
          119 
          120         ElfProgFlagExec = 0x1,
          121         ElfProgFlagWrite = 0x2,
          122         ElfProgFlagRead = 0x4,
          123 
          124         ElfNotePrStatus = 1,
          125         ElfNotePrFpreg = 2,
          126         ElfNotePrPsinfo = 3,
          127         ElfNotePrTaskstruct = 4,
          128         ElfNotePrAuxv = 6,
          129         ElfNotePrXfpreg = 0x46e62b7f        /* for gdb/386 */
          130 };
          131 
          132 struct ElfHdr
          133 {
          134         uchar        magic[4];
          135         uchar        class;
          136         uchar        encoding;
          137         uchar        version;
          138         uchar        abi;
          139         uchar        abiversion;
          140         u32int        type;
          141         u32int        machine;
          142         u64int        entry;
          143         u64int        phoff;
          144         u64int        shoff;
          145         u32int        flags;
          146         u32int        ehsize;
          147         u32int        phentsize;
          148         u32int        phnum;
          149         u32int        shentsize;
          150         u32int        shnum;
          151         u32int        shstrndx;
          152         u16int        (*e2)(uchar*);
          153         u32int        (*e4)(uchar*);
          154         u64int        (*e8)(uchar*);
          155 };
          156 
          157 struct ElfSect
          158 {
          159         char                *name;
          160         u32int        type;
          161         u64int        flags;
          162         u64int        addr;
          163         u64int        offset;
          164         u64int        size;
          165         u32int        link;
          166         u32int        info;
          167         u64int        align;
          168         u64int        entsize;
          169         uchar        *base;
          170 };
          171 
          172 struct ElfProg
          173 {
          174         u32int        type;
          175         u64int        offset;
          176         u64int        vaddr;
          177         u64int        paddr;
          178         u64int        filesz;
          179         u64int        memsz;
          180         u32int        flags;
          181         u64int        align;
          182 };
          183 
          184 struct ElfNote
          185 {
          186         u32int        namesz;
          187         u32int        descsz;
          188         u32int        type;
          189         char        *name;
          190         uchar        *desc;
          191         u32int        offset;        /* in-memory only */
          192 };
          193 
          194 struct ElfSym
          195 {
          196         char*        name;
          197         u64int        value;
          198         u64int        size;
          199         uchar        bind;
          200         uchar        type;
          201         uchar        other;
          202         u16int        shndx;
          203 };
          204 
          205 struct Elf
          206 {
          207         int                fd;
          208         ElfHdr        hdr;
          209         ElfSect        *sect;
          210         uint                nsect;
          211         ElfProg        *prog;
          212         uint                nprog;
          213         char                *shstrtab;
          214 
          215         int                nsymtab;
          216         ElfSect        *symtab;
          217         ElfSect        *symstr;
          218         int                ndynsym;
          219         ElfSect        *dynsym;
          220         ElfSect        *dynstr;
          221         ElfSect        *bss;
          222         ulong        dynamic;                /* offset to elf dynamic crap */
          223 
          224         int                (*coreregs)(Elf*, ElfNote*, uchar**);
          225         int                (*corecmd)(Elf*, ElfNote*, char**);
          226 };
          227 
          228 Elf*        elfopen(char*);
          229 Elf*        elfinit(int);
          230 ElfSect *elfsection(Elf*, char*);
          231 void        elfclose(Elf*);
          232 int        elfsym(Elf*, int, ElfSym*);
          233 int        elfsymlookup(Elf*, char*, ulong*);
          234 int        elfmap(Elf*, ElfSect*);
          235 
          236 struct Fhdr;
          237 void        elfcorelinux386(struct Fhdr*, Elf*, ElfNote*);
          238 void        elfcorefreebsd386(struct Fhdr*, Elf*, ElfNote*);
          239 void        elfcorefreebsdamd64(struct Fhdr*, Elf*, ElfNote*);
          240 void        elfdl386mapdl(int);