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 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 }
68 int
69 elfsymlookup(Elf *elf, char *name, ulong *addr)
70 {
71 int i;
72 ElfSym esym;
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 }
85 int
86 symelf(Fhdr *fhdr)
87 {
88 int ret;
90 ret = -1;
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;
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;
112 if(machdebug)
113 fprint(2, "elf symbols...\n");
115 if(elfsyminit(fhdr) < 0)
116 fprint(2, "initializing elf: %r");
117 else
118 ret = 0;
119 return ret;