| #include <u.h> |
| #include <libc.h> |
| #include <mach.h> |
| #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; |
| } |
| |