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 dd944ec7 2005-01-23 devnull attachargs(int argc, char **argv, int omode, int verbose)
30 e8a7b969 2004-12-27 devnull {
31 e8a7b969 2004-12-27 devnull int i;
32 e8a7b969 2004-12-27 devnull Fhdr *hdr;
33 dd944ec7 2005-01-23 devnull char *s, *t;
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 dd944ec7 2005-01-23 devnull if(verbose)
60 dd944ec7 2005-01-23 devnull fprint(2, "%s: %s %s %s\n", argv[i], hdr->aname, hdr->mname, hdr->fname);
61 e8a7b969 2004-12-27 devnull if(hdr->ftype == FCORE){
62 e8a7b969 2004-12-27 devnull if(corpid){
63 e8a7b969 2004-12-27 devnull fprint(2, "already have corpid %d; ignoring core %s\n", corpid, argv[i]);
64 e8a7b969 2004-12-27 devnull uncrackhdr(hdr);
65 e8a7b969 2004-12-27 devnull continue;
66 e8a7b969 2004-12-27 devnull }
67 e8a7b969 2004-12-27 devnull if(corhdr){
68 e8a7b969 2004-12-27 devnull fprint(2, "already have core %s; ignoring core %s\n", corfil, argv[i]);
69 e8a7b969 2004-12-27 devnull uncrackhdr(hdr);
70 e8a7b969 2004-12-27 devnull continue;
71 e8a7b969 2004-12-27 devnull }
72 e8a7b969 2004-12-27 devnull corhdr = hdr;
73 e8a7b969 2004-12-27 devnull corfil = argv[i];
74 e8a7b969 2004-12-27 devnull }else{
75 e8a7b969 2004-12-27 devnull if(symhdr){
76 e8a7b969 2004-12-27 devnull fprint(2, "already have text %s; ignoring text %s\n", symfil, argv[i]);
77 e8a7b969 2004-12-27 devnull uncrackhdr(hdr);
78 e8a7b969 2004-12-27 devnull continue;
79 e8a7b969 2004-12-27 devnull }
80 e8a7b969 2004-12-27 devnull symhdr = hdr;
81 e8a7b969 2004-12-27 devnull symfil = argv[i];
82 e8a7b969 2004-12-27 devnull }
83 e8a7b969 2004-12-27 devnull }
84 e8a7b969 2004-12-27 devnull
85 e8a7b969 2004-12-27 devnull if(symhdr == nil){
86 e8a7b969 2004-12-27 devnull symfil = "a.out"; /* default */
87 e8a7b969 2004-12-27 devnull if(corpid){ /* try from corpid */
88 e8a7b969 2004-12-27 devnull if((s = proctextfile(corpid)) != nil){
89 4a727cdd 2005-01-23 devnull if(verbose)
90 4a727cdd 2005-01-23 devnull fprint(2, "corpid %d: text %s\n", corpid, s);
91 e8a7b969 2004-12-27 devnull symfil = s;
92 e8a7b969 2004-12-27 devnull }
93 e8a7b969 2004-12-27 devnull }
94 dd944ec7 2005-01-23 devnull if(corhdr && corhdr->cmdline){ /* try from core */
95 dd944ec7 2005-01-23 devnull /*
96 dd944ec7 2005-01-23 devnull * prog gives only the basename of the command,
97 dd944ec7 2005-01-23 devnull * so try the command line for a path.
98 dd944ec7 2005-01-23 devnull */
99 dd944ec7 2005-01-23 devnull if((s = strdup(corhdr->cmdline)) != nil){
100 dd944ec7 2005-01-23 devnull t = strchr(s, ' ');
101 dd944ec7 2005-01-23 devnull if(t)
102 dd944ec7 2005-01-23 devnull *t = 0;
103 dd944ec7 2005-01-23 devnull if((t = searchpath(s)) != nil){
104 dd944ec7 2005-01-23 devnull if(verbose)
105 dd944ec7 2005-01-23 devnull fprint(2, "core: text %s\n", t);
106 dd944ec7 2005-01-23 devnull symfil = t;
107 dd944ec7 2005-01-23 devnull }
108 dd944ec7 2005-01-23 devnull free(s);
109 e8a7b969 2004-12-27 devnull }
110 e8a7b969 2004-12-27 devnull }
111 e8a7b969 2004-12-27 devnull if((symhdr = crackhdr(symfil, omode)) == nil){
112 e8a7b969 2004-12-27 devnull fprint(2, "crackhdr %s: %r\n", symfil);
113 e8a7b969 2004-12-27 devnull symfil = nil;
114 e8a7b969 2004-12-27 devnull }
115 e8a7b969 2004-12-27 devnull }
116 e8a7b969 2004-12-27 devnull
117 e8a7b969 2004-12-27 devnull if(symhdr)
118 0a76e969 2005-01-07 devnull symopen(symhdr);
119 e8a7b969 2004-12-27 devnull
120 e8a7b969 2004-12-27 devnull if(!mach)
121 e8a7b969 2004-12-27 devnull mach = machcpu;
122 e8a7b969 2004-12-27 devnull
123 e8a7b969 2004-12-27 devnull /*
124 e8a7b969 2004-12-27 devnull * Set up maps
125 e8a7b969 2004-12-27 devnull */
126 e8a7b969 2004-12-27 devnull symmap = allocmap();
127 e8a7b969 2004-12-27 devnull cormap = allocmap();
128 e8a7b969 2004-12-27 devnull if(symmap == nil || cormap == nil)
129 e8a7b969 2004-12-27 devnull sysfatal("allocating maps: %r");
130 e8a7b969 2004-12-27 devnull
131 e8a7b969 2004-12-27 devnull if(symhdr){
132 e8a7b969 2004-12-27 devnull if(mapfile(symhdr, 0, symmap, nil) < 0)
133 e8a7b969 2004-12-27 devnull fprint(2, "mapfile %s: %r\n", symfil);
134 e8a7b969 2004-12-27 devnull mapfile(symhdr, 0, cormap, nil);
135 e8a7b969 2004-12-27 devnull }
136 e8a7b969 2004-12-27 devnull
137 fa325e9b 2020-01-10 cross if(corpid)
138 e8a7b969 2004-12-27 devnull attachproc(corpid);
139 e8a7b969 2004-12-27 devnull if(corhdr)
140 e8a7b969 2004-12-27 devnull attachcore(corhdr);
141 e8a7b969 2004-12-27 devnull
142 dd944ec7 2005-01-23 devnull attachdynamic(verbose);
143 e8a7b969 2004-12-27 devnull return 0;
144 e8a7b969 2004-12-27 devnull }
145 e8a7b969 2004-12-27 devnull
146 e8a7b969 2004-12-27 devnull static int thecorpid;
147 e8a7b969 2004-12-27 devnull static Fhdr *thecorhdr;
148 e8a7b969 2004-12-27 devnull
149 e8a7b969 2004-12-27 devnull static void
150 e8a7b969 2004-12-27 devnull unattach(void)
151 e8a7b969 2004-12-27 devnull {
152 e8a7b969 2004-12-27 devnull unmapproc(cormap);
153 e8a7b969 2004-12-27 devnull unmapfile(corhdr, cormap);
154 e8a7b969 2004-12-27 devnull free(correg);
155 e8a7b969 2004-12-27 devnull correg = nil;
156 e8a7b969 2004-12-27 devnull thecorpid = 0;
157 e8a7b969 2004-12-27 devnull thecorhdr = nil;
158 e8a7b969 2004-12-27 devnull corpid = 0;
159 e8a7b969 2004-12-27 devnull corhdr = nil;
160 e8a7b969 2004-12-27 devnull corfil = nil;
161 e8a7b969 2004-12-27 devnull }
162 e8a7b969 2004-12-27 devnull
163 e8a7b969 2004-12-27 devnull int
164 e8a7b969 2004-12-27 devnull attachproc(int pid)
165 e8a7b969 2004-12-27 devnull {
166 e8a7b969 2004-12-27 devnull unattach();
167 e8a7b969 2004-12-27 devnull if(pid == 0)
168 e8a7b969 2004-12-27 devnull return 0;
169 e8a7b969 2004-12-27 devnull if(mapproc(pid, cormap, &correg) < 0){
170 e8a7b969 2004-12-27 devnull fprint(2, "attachproc %d: %r\n", pid);
171 e8a7b969 2004-12-27 devnull return -1;
172 e8a7b969 2004-12-27 devnull }
173 e8a7b969 2004-12-27 devnull thecorpid = pid;
174 e8a7b969 2004-12-27 devnull corpid = pid;
175 e8a7b969 2004-12-27 devnull return 0;
176 e8a7b969 2004-12-27 devnull }
177 e8a7b969 2004-12-27 devnull
178 e8a7b969 2004-12-27 devnull int
179 e8a7b969 2004-12-27 devnull attachcore(Fhdr *hdr)
180 e8a7b969 2004-12-27 devnull {
181 e8a7b969 2004-12-27 devnull unattach();
182 dd944ec7 2005-01-23 devnull if(hdr == nil)
183 e8a7b969 2004-12-27 devnull return 0;
184 e8a7b969 2004-12-27 devnull if(mapfile(hdr, 0, cormap, &correg) < 0){
185 e8a7b969 2004-12-27 devnull fprint(2, "attachcore %s: %r\n", hdr->filename);
186 e8a7b969 2004-12-27 devnull return -1;
187 e8a7b969 2004-12-27 devnull }
188 e8a7b969 2004-12-27 devnull thecorhdr = hdr;
189 e8a7b969 2004-12-27 devnull corhdr = hdr;
190 e8a7b969 2004-12-27 devnull corfil = hdr->filename;
191 e8a7b969 2004-12-27 devnull return 0;
192 e8a7b969 2004-12-27 devnull }
193 e8a7b969 2004-12-27 devnull
194 e8a7b969 2004-12-27 devnull int
195 dd944ec7 2005-01-23 devnull attachdynamic(int verbose)
196 e8a7b969 2004-12-27 devnull {
197 dd944ec7 2005-01-23 devnull extern void elfdl386mapdl(int);
198 dd944ec7 2005-01-23 devnull
199 dd944ec7 2005-01-23 devnull if(mach && mach->type == M386 && symhdr && symhdr->elf)
200 dd944ec7 2005-01-23 devnull elfdl386mapdl(verbose);
201 e8a7b969 2004-12-27 devnull return 0;
202 e8a7b969 2004-12-27 devnull }