Blob


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