#include #include #include #include "stabs.h" /* http://sources.redhat.com/gdb/onlinedocs/stabs.html */ int stabsym(Stab *stabs, int i, StabSym *sym) { uchar *p; ulong x; if(stabs == nil){ werrstr("no stabs"); return -1; } if(stabs->e2==0 || stabs->e4==0){ werrstr("no data extractors"); return -1; } if(i >= stabs->stabsize/12){ werrstr("stabs index out of range"); return -1; } p = stabs->stabbase+i*12; x = stabs->e4(p); if(x == 0) sym->name = nil; else if(x < stabs->strsize) sym->name = stabs->strbase+x; else{ werrstr("bad stabs string index"); return -1; } /* * In theory, if name ends with a backslash, * it continues into the next entry. We could * rewrite these in place and then zero the next * few entries, but let's wait until we run across * some system that generates these. */ sym->type = p[4]; sym->other = p[5]; sym->desc = stabs->e2(p+6); sym->value = stabs->e4(p+8); return 0; }