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
5 e8a7b969 2004-12-27 devnull Fhdr *symhdr;
6 e8a7b969 2004-12-27 devnull Fhdr *corhdr;
7 e8a7b969 2004-12-27 devnull char *symfil;
8 e8a7b969 2004-12-27 devnull char *corfil;
9 e8a7b969 2004-12-27 devnull int corpid;
10 e8a7b969 2004-12-27 devnull Regs *correg;
11 e8a7b969 2004-12-27 devnull Map *symmap;
12 e8a7b969 2004-12-27 devnull Map *cormap;
13 e8a7b969 2004-12-27 devnull
14 bdfd1b27 2005-01-07 devnull static int
15 e8a7b969 2004-12-27 devnull alldigs(char *s)
16 e8a7b969 2004-12-27 devnull {
17 e8a7b969 2004-12-27 devnull while(*s){
18 e8a7b969 2004-12-27 devnull if(*s<'0' || '9'<*s)
19 e8a7b969 2004-12-27 devnull return 0;
20 e8a7b969 2004-12-27 devnull s++;
21 e8a7b969 2004-12-27 devnull }
22 e8a7b969 2004-12-27 devnull return 1;
23 e8a7b969 2004-12-27 devnull }
24 e8a7b969 2004-12-27 devnull
25 e8a7b969 2004-12-27 devnull /*
26 e8a7b969 2004-12-27 devnull * attach to arguments in argc, argv
27 e8a7b969 2004-12-27 devnull */
28 e8a7b969 2004-12-27 devnull int
29 e8a7b969 2004-12-27 devnull attachargs(int argc, char **argv, int omode)
30 e8a7b969 2004-12-27 devnull {
31 e8a7b969 2004-12-27 devnull int i;
32 e8a7b969 2004-12-27 devnull Fhdr *hdr;
33 e8a7b969 2004-12-27 devnull char *s;
34 e8a7b969 2004-12-27 devnull
35 e8a7b969 2004-12-27 devnull symhdr = nil;
36 e8a7b969 2004-12-27 devnull corhdr = nil;
37 e8a7b969 2004-12-27 devnull symfil = nil;
38 e8a7b969 2004-12-27 devnull corfil = nil;
39 e8a7b969 2004-12-27 devnull corpid = 0;
40 e8a7b969 2004-12-27 devnull correg = nil;
41 e8a7b969 2004-12-27 devnull
42 e8a7b969 2004-12-27 devnull for(i=0; i<argc; i++){
43 e8a7b969 2004-12-27 devnull if(alldigs(argv[i])){
44 e8a7b969 2004-12-27 devnull if(corpid){
45 e8a7b969 2004-12-27 devnull fprint(2, "already have corpid %d; ignoring corpid %d\n", corpid, argv[i]);
46 e8a7b969 2004-12-27 devnull continue;
47 e8a7b969 2004-12-27 devnull }
48 e8a7b969 2004-12-27 devnull if(corhdr){
49 e8a7b969 2004-12-27 devnull fprint(2, "already have core %s; ignoring corpid %d\n", corfil, corpid);
50 e8a7b969 2004-12-27 devnull continue;
51 e8a7b969 2004-12-27 devnull }
52 e8a7b969 2004-12-27 devnull corpid = atoi(argv[i]);
53 e8a7b969 2004-12-27 devnull continue;
54 e8a7b969 2004-12-27 devnull }
55 e8a7b969 2004-12-27 devnull if((hdr = crackhdr(argv[i], omode)) == nil){
56 e8a7b969 2004-12-27 devnull fprint(2, "crackhdr %s: %r\n", argv[i]);
57 e8a7b969 2004-12-27 devnull continue;
58 e8a7b969 2004-12-27 devnull }
59 e8a7b969 2004-12-27 devnull fprint(2, "%s: %s %s %s\n", argv[i], hdr->aname, hdr->mname, hdr->fname);
60 e8a7b969 2004-12-27 devnull if(hdr->ftype == FCORE){
61 e8a7b969 2004-12-27 devnull if(corpid){
62 e8a7b969 2004-12-27 devnull fprint(2, "already have corpid %d; ignoring core %s\n", corpid, argv[i]);
63 e8a7b969 2004-12-27 devnull uncrackhdr(hdr);
64 e8a7b969 2004-12-27 devnull continue;
65 e8a7b969 2004-12-27 devnull }
66 e8a7b969 2004-12-27 devnull if(corhdr){
67 e8a7b969 2004-12-27 devnull fprint(2, "already have core %s; ignoring core %s\n", corfil, argv[i]);
68 e8a7b969 2004-12-27 devnull uncrackhdr(hdr);
69 e8a7b969 2004-12-27 devnull continue;
70 e8a7b969 2004-12-27 devnull }
71 e8a7b969 2004-12-27 devnull corhdr = hdr;
72 e8a7b969 2004-12-27 devnull corfil = argv[i];
73 e8a7b969 2004-12-27 devnull }else{
74 e8a7b969 2004-12-27 devnull if(symhdr){
75 e8a7b969 2004-12-27 devnull fprint(2, "already have text %s; ignoring text %s\n", symfil, argv[i]);
76 e8a7b969 2004-12-27 devnull uncrackhdr(hdr);
77 e8a7b969 2004-12-27 devnull continue;
78 e8a7b969 2004-12-27 devnull }
79 e8a7b969 2004-12-27 devnull symhdr = hdr;
80 e8a7b969 2004-12-27 devnull symfil = argv[i];
81 e8a7b969 2004-12-27 devnull }
82 e8a7b969 2004-12-27 devnull }
83 e8a7b969 2004-12-27 devnull
84 e8a7b969 2004-12-27 devnull if(symhdr == nil){
85 e8a7b969 2004-12-27 devnull symfil = "a.out"; /* default */
86 e8a7b969 2004-12-27 devnull if(corpid){ /* try from corpid */
87 e8a7b969 2004-12-27 devnull if((s = proctextfile(corpid)) != nil){
88 e8a7b969 2004-12-27 devnull fprint(2, "corpid %d: text %s\n", corpid, s);
89 e8a7b969 2004-12-27 devnull symfil = s;
90 e8a7b969 2004-12-27 devnull }
91 e8a7b969 2004-12-27 devnull }
92 e8a7b969 2004-12-27 devnull if(corhdr){ /* try from core */
93 e8a7b969 2004-12-27 devnull if(corhdr->txtfil != nil){
94 e8a7b969 2004-12-27 devnull fprint(2, "core %s: text %s\n", corfil, corhdr->txtfil);
95 e8a7b969 2004-12-27 devnull symfil = corhdr->txtfil;
96 e8a7b969 2004-12-27 devnull }
97 e8a7b969 2004-12-27 devnull }
98 e8a7b969 2004-12-27 devnull if((symhdr = crackhdr(symfil, omode)) == nil){
99 e8a7b969 2004-12-27 devnull fprint(2, "crackhdr %s: %r\n", symfil);
100 e8a7b969 2004-12-27 devnull symfil = nil;
101 e8a7b969 2004-12-27 devnull }
102 e8a7b969 2004-12-27 devnull }
103 e8a7b969 2004-12-27 devnull
104 e8a7b969 2004-12-27 devnull if(symhdr)
105 0a76e969 2005-01-07 devnull symopen(symhdr);
106 e8a7b969 2004-12-27 devnull
107 e8a7b969 2004-12-27 devnull if(!mach)
108 e8a7b969 2004-12-27 devnull mach = machcpu;
109 e8a7b969 2004-12-27 devnull
110 e8a7b969 2004-12-27 devnull /*
111 e8a7b969 2004-12-27 devnull * Set up maps
112 e8a7b969 2004-12-27 devnull */
113 e8a7b969 2004-12-27 devnull symmap = allocmap();
114 e8a7b969 2004-12-27 devnull cormap = allocmap();
115 e8a7b969 2004-12-27 devnull if(symmap == nil || cormap == nil)
116 e8a7b969 2004-12-27 devnull sysfatal("allocating maps: %r");
117 e8a7b969 2004-12-27 devnull
118 e8a7b969 2004-12-27 devnull if(symhdr){
119 e8a7b969 2004-12-27 devnull if(mapfile(symhdr, 0, symmap, nil) < 0)
120 e8a7b969 2004-12-27 devnull fprint(2, "mapfile %s: %r\n", symfil);
121 e8a7b969 2004-12-27 devnull mapfile(symhdr, 0, cormap, nil);
122 e8a7b969 2004-12-27 devnull }
123 e8a7b969 2004-12-27 devnull
124 e8a7b969 2004-12-27 devnull if(corpid)
125 e8a7b969 2004-12-27 devnull attachproc(corpid);
126 e8a7b969 2004-12-27 devnull
127 e8a7b969 2004-12-27 devnull if(corhdr)
128 e8a7b969 2004-12-27 devnull attachcore(corhdr);
129 e8a7b969 2004-12-27 devnull
130 e8a7b969 2004-12-27 devnull return 0;
131 e8a7b969 2004-12-27 devnull }
132 e8a7b969 2004-12-27 devnull
133 e8a7b969 2004-12-27 devnull static int thecorpid;
134 e8a7b969 2004-12-27 devnull static Fhdr *thecorhdr;
135 e8a7b969 2004-12-27 devnull
136 e8a7b969 2004-12-27 devnull static void
137 e8a7b969 2004-12-27 devnull unattach(void)
138 e8a7b969 2004-12-27 devnull {
139 e8a7b969 2004-12-27 devnull unmapproc(cormap);
140 e8a7b969 2004-12-27 devnull unmapfile(corhdr, cormap);
141 e8a7b969 2004-12-27 devnull free(correg);
142 e8a7b969 2004-12-27 devnull correg = nil;
143 e8a7b969 2004-12-27 devnull thecorpid = 0;
144 e8a7b969 2004-12-27 devnull thecorhdr = nil;
145 e8a7b969 2004-12-27 devnull corpid = 0;
146 e8a7b969 2004-12-27 devnull corhdr = nil;
147 e8a7b969 2004-12-27 devnull corfil = nil;
148 e8a7b969 2004-12-27 devnull }
149 e8a7b969 2004-12-27 devnull
150 e8a7b969 2004-12-27 devnull int
151 e8a7b969 2004-12-27 devnull attachproc(int pid)
152 e8a7b969 2004-12-27 devnull {
153 e8a7b969 2004-12-27 devnull unattach();
154 e8a7b969 2004-12-27 devnull if(pid == 0)
155 e8a7b969 2004-12-27 devnull return 0;
156 e8a7b969 2004-12-27 devnull if(mapproc(pid, cormap, &correg) < 0){
157 e8a7b969 2004-12-27 devnull fprint(2, "attachproc %d: %r\n", pid);
158 e8a7b969 2004-12-27 devnull return -1;
159 e8a7b969 2004-12-27 devnull }
160 e8a7b969 2004-12-27 devnull thecorpid = pid;
161 e8a7b969 2004-12-27 devnull corpid = pid;
162 e8a7b969 2004-12-27 devnull return 0;
163 e8a7b969 2004-12-27 devnull }
164 e8a7b969 2004-12-27 devnull
165 e8a7b969 2004-12-27 devnull int
166 e8a7b969 2004-12-27 devnull attachcore(Fhdr *hdr)
167 e8a7b969 2004-12-27 devnull {
168 e8a7b969 2004-12-27 devnull unattach();
169 e8a7b969 2004-12-27 devnull if(corhdr == nil)
170 e8a7b969 2004-12-27 devnull return 0;
171 e8a7b969 2004-12-27 devnull if(mapfile(hdr, 0, cormap, &correg) < 0){
172 e8a7b969 2004-12-27 devnull fprint(2, "attachcore %s: %r\n", hdr->filename);
173 e8a7b969 2004-12-27 devnull return -1;
174 e8a7b969 2004-12-27 devnull }
175 e8a7b969 2004-12-27 devnull thecorhdr = hdr;
176 e8a7b969 2004-12-27 devnull corhdr = hdr;
177 e8a7b969 2004-12-27 devnull corfil = hdr->filename;
178 e8a7b969 2004-12-27 devnull return 0;
179 e8a7b969 2004-12-27 devnull }
180 e8a7b969 2004-12-27 devnull
181 e8a7b969 2004-12-27 devnull int
182 e8a7b969 2004-12-27 devnull attachdynamic(void)
183 e8a7b969 2004-12-27 devnull {
184 bdfd1b27 2005-01-07 devnull extern void elfdl386mapdl(void);
185 e8a7b969 2004-12-27 devnull elfdl386mapdl();
186 e8a7b969 2004-12-27 devnull return 0;
187 e8a7b969 2004-12-27 devnull }
188 e8a7b969 2004-12-27 devnull