rsc | a84cbb2 | 2004-04-19 19:29:25 +0000 | [diff] [blame] | 1 | #include <u.h> |
| 2 | #include <libc.h> |
| 3 | #include <mach.h> |
| 4 | #include "elf.h" |
| 5 | |
| 6 | static int |
| 7 | elfsyminit(Fhdr *fp) |
| 8 | { |
| 9 | int i, onlyundef; |
| 10 | Elf *elf; |
| 11 | Symbol sym; |
| 12 | ElfSym esym; |
| 13 | ElfProg *p; |
| 14 | |
| 15 | elf = fp->elf; |
| 16 | |
| 17 | onlyundef = fp->nsym > 0; |
| 18 | for(i=0; elfsym(elf, i, &esym) >= 0; i++){ |
| 19 | if(esym.name == nil) |
| 20 | continue; |
| 21 | if(onlyundef && esym.shndx != ElfSymShnNone) |
| 22 | continue; |
| 23 | if(esym.type != ElfSymTypeObject && esym.type != ElfSymTypeFunc) |
| 24 | continue; |
| 25 | if(strchr(esym.name, '@')) |
| 26 | continue; |
| 27 | memset(&sym, 0, sizeof sym); |
| 28 | sym.name = esym.name; |
| 29 | sym.loc.type = LADDR; |
| 30 | sym.loc.addr = esym.value; |
| 31 | if(esym.size){ |
| 32 | sym.hiloc.type = LADDR; |
| 33 | sym.hiloc.addr = esym.value+esym.size; |
| 34 | } |
| 35 | sym.fhdr = fp; |
| 36 | if(esym.type==ElfSymTypeObject){ |
| 37 | sym.class = CDATA; |
| 38 | sym.type = 'D'; |
| 39 | if(&elf->sect[esym.shndx] == elf->bss) |
| 40 | sym.type = 'B'; |
| 41 | }else if(esym.type==ElfSymTypeFunc){ |
| 42 | sym.class = CTEXT; |
| 43 | sym.type = 'T'; |
| 44 | } |
| 45 | if(esym.shndx == ElfSymShnNone) |
| 46 | sym.type = 'U'; |
| 47 | if(esym.bind==ElfSymBindLocal) |
| 48 | sym.type += 'a' - 'A'; |
| 49 | addsym(fp, &sym); |
| 50 | } |
| 51 | |
| 52 | for(i=0; i<elf->nprog; i++){ |
| 53 | p = &elf->prog[i]; |
| 54 | if(p->type != ElfProgDynamic) |
| 55 | continue; |
| 56 | memset(&sym, 0, sizeof sym); |
| 57 | sym.name = "_DYNAMIC"; |
| 58 | sym.loc = locaddr(p->vaddr); |
| 59 | sym.hiloc = locaddr(p->vaddr+p->filesz); |
| 60 | sym.type = 'D'; |
| 61 | sym.class = CDATA; |
| 62 | addsym(fp, &sym); |
| 63 | } |
| 64 | return 0; |
| 65 | } |
| 66 | |
| 67 | int |
| 68 | symelf(Fhdr *fhdr) |
| 69 | { |
| 70 | int ret; |
| 71 | |
| 72 | ret = -1; |
| 73 | |
| 74 | /* try dwarf */ |
| 75 | if(fhdr->dwarf){ |
| 76 | if(machdebug) |
| 77 | fprint(2, "dwarf symbols...\n"); |
| 78 | if(symdwarf(fhdr) < 0) |
| 79 | fprint(2, "initializing dwarf: %r"); |
| 80 | else |
| 81 | ret = 0; |
| 82 | } |
| 83 | |
| 84 | /* try stabs */ |
| 85 | if(fhdr->stabs.stabbase){ |
| 86 | if(machdebug) |
| 87 | fprint(2, "stabs symbols...\n"); |
| 88 | if(symstabs(fhdr) < 0) |
| 89 | fprint(2, "initializing stabs: %r"); |
| 90 | else |
| 91 | ret = 0; |
| 92 | } |
| 93 | |
| 94 | if(machdebug) |
| 95 | fprint(2, "elf symbols...\n"); |
| 96 | |
| 97 | if(elfsyminit(fhdr) < 0) |
| 98 | fprint(2, "initializing elf: %r"); |
| 99 | else |
| 100 | ret = 0; |
| 101 | return ret; |
| 102 | } |
| 103 | |