symelf.c (2186B)
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 elf->dynamic = p->vaddr; 57 memset(&sym, 0, sizeof sym); 58 sym.name = "_DYNAMIC"; 59 sym.loc = locaddr(p->vaddr); 60 sym.hiloc = locaddr(p->vaddr+p->filesz); 61 sym.type = 'D'; 62 sym.class = CDATA; 63 _addsym(fp, &sym); 64 } 65 return 0; 66 } 67 68 int 69 elfsymlookup(Elf *elf, char *name, ulong *addr) 70 { 71 int i; 72 ElfSym esym; 73 74 for(i=0; elfsym(elf, i, &esym) >= 0; i++){ 75 if(esym.name == nil) 76 continue; 77 if(strcmp(esym.name, name) == 0){ 78 *addr = esym.value; 79 return 0; 80 } 81 } 82 return -1; 83 } 84 85 int 86 symelf(Fhdr *fhdr) 87 { 88 int ret; 89 90 ret = -1; 91 92 /* try dwarf */ 93 if(fhdr->dwarf){ 94 if(machdebug) 95 fprint(2, "dwarf symbols...\n"); 96 if(symdwarf(fhdr) < 0) 97 fprint(2, "initializing dwarf: %r"); 98 else 99 ret = 0; 100 } 101 102 /* try stabs */ 103 if(fhdr->stabs.stabbase){ 104 if(machdebug) 105 fprint(2, "stabs symbols...\n"); 106 if(symstabs(fhdr) < 0) 107 fprint(2, "initializing stabs: %r"); 108 else 109 ret = 0; 110 } 111 112 if(machdebug) 113 fprint(2, "elf symbols...\n"); 114 115 if(elfsyminit(fhdr) < 0) 116 fprint(2, "initializing elf: %r"); 117 else 118 ret = 0; 119 return ret; 120 }