Blame


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