Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <mach.h>
4 #include "elf.h"
6 static int
7 elfsyminit(Fhdr *fp)
8 {
9 int i, onlyundef;
10 Elf *elf;
11 Symbol sym;
12 ElfSym esym;
13 ElfProg *p;
15 elf = fp->elf;
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 }
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 }
67 int
68 symelf(Fhdr *fhdr)
69 {
70 int ret;
72 ret = -1;
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 }
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 }
94 if(machdebug)
95 fprint(2, "elf symbols...\n");
97 if(elfsyminit(fhdr) < 0)
98 fprint(2, "initializing elf: %r");
99 else
100 ret = 0;
101 return ret;