URI:
       tdwarfpubnames.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
       ---
       tdwarfpubnames.c (1506B)
       ---
            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 _dwarfnametounit(Dwarf *d, char *name, DwarfBlock *bl, DwarfSym *s)
            9 {
           10         int vers;
           11         ulong len, unit, off;
           12         uchar *next;
           13         char *str;
           14         DwarfBuf b;
           15 
           16         b.d = d;
           17         b.p = bl->data;
           18         b.ep = b.p + bl->len;
           19 
           20         while(b.p < b.ep){
           21                 len = dwarfget4(&b);
           22                 if(len > b.ep-b.p){
           23                         werrstr("bad length in dwarf name header");
           24                         return -1;
           25                 }
           26                 next = b.p + len;
           27                 vers = dwarfget2(&b);
           28                 if(vers != 1 && vers != 2){
           29                         werrstr("bad version %d in dwarf name header", vers);
           30                         return -1;
           31                 }
           32                 unit = dwarfget4(&b);
           33                 dwarfget4(&b);        /* unit length */
           34                 while(b.p < next){
           35                         off = dwarfget4(&b);
           36                         if(off == 0)
           37                                 break;
           38                         str = dwarfgetstring(&b);
           39                         if(strcmp(str, name) == 0){
           40                                 if(dwarfenumunit(d, unit, s) < 0)
           41                                         return -1;
           42                                 if(unit + off >= s->b.ep - d->info.data){
           43                                         werrstr("bad offset in name entry");
           44                                         return -1;
           45                                 }
           46                                 s->b.p = d->info.data + unit + off;
           47                                 if(dwarfnextsym(d, s) < 0)
           48                                         return -1;
           49                                 if(s->attrs.name==nil || strcmp(s->attrs.name, name)!=0){
           50                                         werrstr("unexpected name %#q in lookup for %#q", s->attrs.name, name);
           51                                         return -1;
           52                                 }
           53                                 return 0;
           54                         }
           55                 }
           56                 b.p = next;
           57         }
           58         werrstr("unknown name '%s'", name);
           59         return -1;
           60 }
           61 
           62 int
           63 dwarflookupname(Dwarf *d, char *name, DwarfSym *sym)
           64 {
           65         return _dwarfnametounit(d, name, &d->pubnames, sym);
           66 }
           67 
           68 /*
           69 
           70 int
           71 dwarflookuptype(Dwarf *d, char *name, DwarfSym *sym)
           72 {
           73         return _dwarfnametounit(d, name, &d->pubtypes, sym);
           74 }
           75 
           76  */