URI:
       tdwarfopen.c - 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
       ---
       tdwarfopen.c (2000B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <bio.h>
            4 #include "elf.h"
            5 #include "dwarf.h"
            6 
            7 static int
            8 readblock(int fd, DwarfBlock *b, ulong off, ulong len)
            9 {
           10         b->data = malloc(len);
           11         if(b->data == nil)
           12                 return -1;
           13         if(seek(fd, off, 0) < 0 || readn(fd, b->data, len) != len){
           14                 free(b->data);
           15                 b->data = nil;
           16                 return -1;
           17         }
           18         b->len = len;
           19         return 0;
           20 }
           21 
           22 static int
           23 findsection(Elf *elf, char *name, ulong *off, ulong *len)
           24 {
           25         ElfSect *s;
           26 
           27         if((s = elfsection(elf, name)) == nil)
           28                 return -1;
           29         *off = s->offset;
           30         *len = s->size;
           31         return s - elf->sect;
           32 }
           33 
           34 static int
           35 loadsection(Elf *elf, char *name, DwarfBlock *b)
           36 {
           37         ulong off, len;
           38 
           39         if(findsection(elf, name, &off, &len) < 0)
           40                 return -1;
           41         return readblock(elf->fd, b, off, len);
           42 }
           43 
           44 Dwarf*
           45 dwarfopen(Elf *elf)
           46 {
           47         Dwarf *d;
           48 
           49         if(elf == nil){
           50                 werrstr("nil elf passed to dwarfopen");
           51                 return nil;
           52         }
           53 
           54         d = mallocz(sizeof(Dwarf), 1);
           55         if(d == nil)
           56                 return nil;
           57 
           58         d->elf = elf;
           59         if(loadsection(elf, ".debug_abbrev", &d->abbrev) < 0
           60         || loadsection(elf, ".debug_aranges", &d->aranges) < 0
           61         || loadsection(elf, ".debug_line", &d->line) < 0
           62         || loadsection(elf, ".debug_pubnames", &d->pubnames) < 0
           63         || loadsection(elf, ".debug_info", &d->info) < 0)
           64                 goto err;
           65         loadsection(elf, ".debug_frame", &d->frame);
           66         loadsection(elf, ".debug_ranges", &d->ranges);
           67         loadsection(elf, ".debug_str", &d->str);
           68 
           69         /* make this a table once there are more */
           70         switch(d->elf->hdr.machine){
           71         case ElfMach386:
           72                 d->reg = dwarf386regs;
           73                 d->nreg = dwarf386nregs;
           74                 break;
           75         default:
           76                 werrstr("unsupported machine");
           77                 goto err;
           78         }
           79 
           80         return d;
           81 
           82 err:
           83         free(d->abbrev.data);
           84         free(d->aranges.data);
           85         free(d->frame.data);
           86         free(d->line.data);
           87         free(d->pubnames.data);
           88         free(d->ranges.data);
           89         free(d->str.data);
           90         free(d->info.data);
           91         free(d);
           92         return nil;
           93 }
           94 
           95 void
           96 dwarfclose(Dwarf *d)
           97 {
           98         free(d->abbrev.data);
           99         free(d->aranges.data);
          100         free(d->frame.data);
          101         free(d->line.data);
          102         free(d->pubnames.data);
          103         free(d->ranges.data);
          104         free(d->str.data);
          105         free(d->info.data);
          106         free(d);
          107 }