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"
7 e8a7b969 2004-12-27 devnull aggr Linkdebug
9 e8a7b969 2004-12-27 devnull 'X' 0 version;
10 e8a7b969 2004-12-27 devnull 'X' 4 map;
13 e8a7b969 2004-12-27 devnull aggr Linkmap
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;
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,
29 e8a7b969 2004-12-27 devnull DT_STRTAB,
30 e8a7b969 2004-12-27 devnull DT_SYMTAB,
32 e8a7b969 2004-12-27 devnull DT_RELASZ = 8,
33 e8a7b969 2004-12-27 devnull DT_RELAENT,
35 e8a7b969 2004-12-27 devnull DT_SYMENT,
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,
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
50 e8a7b969 2004-12-27 devnull static int
51 e8a7b969 2004-12-27 devnull getstr(Map *map, ulong addr, char *buf, uint nbuf)
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;
61 e8a7b969 2004-12-27 devnull return -1; /* no nul */
64 e8a7b969 2004-12-27 devnull static ulong
65 e8a7b969 2004-12-27 devnull dyninfo(Fhdr *hdr, int x)
67 e8a7b969 2004-12-27 devnull u32int addr, u;
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;
73 e8a7b969 2004-12-27 devnull addr += hdr->base;
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;
83 e8a7b969 2004-12-27 devnull addr += 8;
85 e8a7b969 2004-12-27 devnull return 0;
89 dd944ec7 2005-01-23 devnull elfdl386mapdl(int verbose)
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];
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");
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);
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)
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;
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){
124 dd944ec7 2005-01-23 devnull * Need to map the text file under the core file.
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);
130 dd944ec7 2005-01-23 devnull if(symopen(hdr) < 0)
131 dd944ec7 2005-01-23 devnull fprint(2, "syminit %s: %r\n", buf);