plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

dwarfpubnames.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  */