Blame


1 e8a7b969 2004-12-27 devnull #include <u.h>
2 e8a7b969 2004-12-27 devnull #include <libc.h>
3 e8a7b969 2004-12-27 devnull #include <mach.h>
4 e8a7b969 2004-12-27 devnull #include "elf.h"
5 e8a7b969 2004-12-27 devnull
6 e8a7b969 2004-12-27 devnull /*
7 e8a7b969 2004-12-27 devnull aggr Linkdebug
8 e8a7b969 2004-12-27 devnull {
9 e8a7b969 2004-12-27 devnull 'X' 0 version;
10 e8a7b969 2004-12-27 devnull 'X' 4 map;
11 e8a7b969 2004-12-27 devnull };
12 e8a7b969 2004-12-27 devnull
13 e8a7b969 2004-12-27 devnull aggr Linkmap
14 e8a7b969 2004-12-27 devnull {
15 e8a7b969 2004-12-27 devnull 'X' 0 addr;
16 e8a7b969 2004-12-27 devnull 'X' 4 name;
17 e8a7b969 2004-12-27 devnull 'X' 8 dynsect;
18 e8a7b969 2004-12-27 devnull 'X' 12 next;
19 e8a7b969 2004-12-27 devnull 'X' 16 prev;
20 e8a7b969 2004-12-27 devnull };
21 e8a7b969 2004-12-27 devnull */
22 e8a7b969 2004-12-27 devnull enum
23 e8a7b969 2004-12-27 devnull {
24 e8a7b969 2004-12-27 devnull DT_NULL = 0,
25 e8a7b969 2004-12-27 devnull DT_NEEDED,
26 e8a7b969 2004-12-27 devnull DT_PLTRRELSZ,
27 e8a7b969 2004-12-27 devnull DT_PLTGOT,
28 e8a7b969 2004-12-27 devnull DT_HASH,
29 e8a7b969 2004-12-27 devnull DT_STRTAB,
30 e8a7b969 2004-12-27 devnull DT_SYMTAB,
31 e8a7b969 2004-12-27 devnull DT_RELA,
32 e8a7b969 2004-12-27 devnull DT_RELASZ = 8,
33 e8a7b969 2004-12-27 devnull DT_RELAENT,
34 e8a7b969 2004-12-27 devnull DT_STSZ,
35 e8a7b969 2004-12-27 devnull DT_SYMENT,
36 e8a7b969 2004-12-27 devnull DT_INIT,
37 e8a7b969 2004-12-27 devnull DT_FINI,
38 e8a7b969 2004-12-27 devnull DT_SONAME,
39 e8a7b969 2004-12-27 devnull DT_RPATH,
40 e8a7b969 2004-12-27 devnull DT_SYMBOLIC = 16,
41 e8a7b969 2004-12-27 devnull DT_REL,
42 e8a7b969 2004-12-27 devnull DT_RELSZ,
43 e8a7b969 2004-12-27 devnull DT_RELENT,
44 e8a7b969 2004-12-27 devnull DT_PLTREL,
45 e8a7b969 2004-12-27 devnull DT_DEBUG,
46 e8a7b969 2004-12-27 devnull DT_TEXTREL,
47 cbeb0b26 2006-04-01 devnull DT_JMPREL
48 e8a7b969 2004-12-27 devnull };
49 e8a7b969 2004-12-27 devnull
50 e8a7b969 2004-12-27 devnull static int
51 e8a7b969 2004-12-27 devnull getstr(Map *map, ulong addr, char *buf, uint nbuf)
52 e8a7b969 2004-12-27 devnull {
53 e8a7b969 2004-12-27 devnull int i;
54 e8a7b969 2004-12-27 devnull
55 e8a7b969 2004-12-27 devnull for(i=0; i<nbuf; i++){
56 399ab50a 2005-01-14 devnull if(get1(map, addr+i, (uchar*)buf+i, 1) < 0)
57 e8a7b969 2004-12-27 devnull return -1;
58 e8a7b969 2004-12-27 devnull if(buf[i] == 0)
59 e8a7b969 2004-12-27 devnull return 0;
60 e8a7b969 2004-12-27 devnull }
61 e8a7b969 2004-12-27 devnull return -1; /* no nul */
62 e8a7b969 2004-12-27 devnull }
63 e8a7b969 2004-12-27 devnull
64 e8a7b969 2004-12-27 devnull static ulong
65 e8a7b969 2004-12-27 devnull dyninfo(Fhdr *hdr, int x)
66 e8a7b969 2004-12-27 devnull {
67 e8a7b969 2004-12-27 devnull u32int addr, u;
68 e8a7b969 2004-12-27 devnull
69 e8a7b969 2004-12-27 devnull if(hdr == nil || (addr = ((Elf*)hdr->elf)->dynamic) == 0){
70 e8a7b969 2004-12-27 devnull fprint(2, "no hdr/dynamic %p\n", hdr);
71 e8a7b969 2004-12-27 devnull return 0;
72 e8a7b969 2004-12-27 devnull }
73 e8a7b969 2004-12-27 devnull addr += hdr->base;
74 e8a7b969 2004-12-27 devnull
75 e8a7b969 2004-12-27 devnull while(addr != 0){
76 e8a7b969 2004-12-27 devnull if(get4(cormap, addr, &u) < 0)
77 e8a7b969 2004-12-27 devnull return 0;
78 e8a7b969 2004-12-27 devnull if(u == x){
79 e8a7b969 2004-12-27 devnull if(get4(cormap, addr+4, &u) < 0)
80 e8a7b969 2004-12-27 devnull return 0;
81 e8a7b969 2004-12-27 devnull return u;
82 e8a7b969 2004-12-27 devnull }
83 e8a7b969 2004-12-27 devnull addr += 8;
84 e8a7b969 2004-12-27 devnull }
85 e8a7b969 2004-12-27 devnull return 0;
86 e8a7b969 2004-12-27 devnull }
87 e8a7b969 2004-12-27 devnull
88 e8a7b969 2004-12-27 devnull void
89 dd944ec7 2005-01-23 devnull elfdl386mapdl(int verbose)
90 e8a7b969 2004-12-27 devnull {
91 e8a7b969 2004-12-27 devnull int i;
92 e8a7b969 2004-12-27 devnull Fhdr *hdr;
93 e8a7b969 2004-12-27 devnull u32int linkdebug, linkmap, name, addr;
94 e8a7b969 2004-12-27 devnull char buf[1024];
95 e8a7b969 2004-12-27 devnull
96 e8a7b969 2004-12-27 devnull if((linkdebug = dyninfo(symhdr, DT_DEBUG)) == 0){
97 e8a7b969 2004-12-27 devnull fprint(2, "no dt_debug section\n");
98 e8a7b969 2004-12-27 devnull return;
99 e8a7b969 2004-12-27 devnull }
100 e8a7b969 2004-12-27 devnull if(get4(cormap, linkdebug+4, &linkmap) < 0){
101 e8a7b969 2004-12-27 devnull fprint(2, "get4 linkdebug+4 (0x%lux) failed\n", linkdebug);
102 e8a7b969 2004-12-27 devnull return;
103 e8a7b969 2004-12-27 devnull }
104 e8a7b969 2004-12-27 devnull
105 e8a7b969 2004-12-27 devnull for(i=0; i<100 && linkmap != 0; i++){
106 e8a7b969 2004-12-27 devnull if(get4(cormap, linkmap, &addr) < 0
107 e8a7b969 2004-12-27 devnull || get4(cormap, linkmap+4, &name) < 0
108 e8a7b969 2004-12-27 devnull || get4(cormap, linkmap+12, &linkmap) < 0)
109 e8a7b969 2004-12-27 devnull break;
110 e8a7b969 2004-12-27 devnull
111 dd944ec7 2005-01-23 devnull if(name == 0 || getstr(cormap, name, buf, sizeof buf) < 0 || buf[0] == 0)
112 dd944ec7 2005-01-23 devnull continue;
113 dd944ec7 2005-01-23 devnull if((hdr = crackhdr(buf, OREAD)) == nil){
114 dd944ec7 2005-01-23 devnull fprint(2, "crackhdr %s: %r\n", buf);
115 dd944ec7 2005-01-23 devnull continue;
116 dd944ec7 2005-01-23 devnull }
117 dd944ec7 2005-01-23 devnull hdr->base = addr;
118 dd944ec7 2005-01-23 devnull if(verbose)
119 dd944ec7 2005-01-23 devnull fprint(2, "%s: %s %s %s\n", buf, hdr->aname, hdr->mname, hdr->fname);
120 dd944ec7 2005-01-23 devnull if(mapfile(hdr, addr, symmap, nil) < 0)
121 dd944ec7 2005-01-23 devnull fprint(2, "mapping %s: %r\n", buf);
122 dd944ec7 2005-01-23 devnull if(corhdr){
123 dd944ec7 2005-01-23 devnull /*
124 dd944ec7 2005-01-23 devnull * Need to map the text file under the core file.
125 dd944ec7 2005-01-23 devnull */
126 dd944ec7 2005-01-23 devnull unmapfile(corhdr, cormap);
127 dd944ec7 2005-01-23 devnull mapfile(hdr, addr, cormap, nil);
128 dd944ec7 2005-01-23 devnull mapfile(corhdr, 0, cormap, nil);
129 dd944ec7 2005-01-23 devnull }
130 dd944ec7 2005-01-23 devnull if(symopen(hdr) < 0)
131 dd944ec7 2005-01-23 devnull fprint(2, "syminit %s: %r\n", buf);
132 e8a7b969 2004-12-27 devnull }
133 e8a7b969 2004-12-27 devnull }