Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <mach.h>
5 Fhdr *symhdr;
6 Fhdr *corhdr;
7 char *symfil;
8 char *corfil;
9 int corpid;
10 Regs *correg;
11 Map *symmap;
12 Map *cormap;
14 static int
15 alldigs(char *s)
16 {
17 while(*s){
18 if(*s<'0' || '9'<*s)
19 return 0;
20 s++;
21 }
22 return 1;
23 }
25 /*
26 * attach to arguments in argc, argv
27 */
28 int
29 attachargs(int argc, char **argv, int omode, int verbose)
30 {
31 int i;
32 Fhdr *hdr;
33 char *s, *t;
35 symhdr = nil;
36 corhdr = nil;
37 symfil = nil;
38 corfil = nil;
39 corpid = 0;
40 correg = nil;
42 for(i=0; i<argc; i++){
43 if(alldigs(argv[i])){
44 if(corpid){
45 fprint(2, "already have corpid %d; ignoring corpid %d\n", corpid, argv[i]);
46 continue;
47 }
48 if(corhdr){
49 fprint(2, "already have core %s; ignoring corpid %d\n", corfil, corpid);
50 continue;
51 }
52 corpid = atoi(argv[i]);
53 continue;
54 }
55 if((hdr = crackhdr(argv[i], omode)) == nil){
56 fprint(2, "crackhdr %s: %r\n", argv[i]);
57 continue;
58 }
59 if(verbose)
60 fprint(2, "%s: %s %s %s\n", argv[i], hdr->aname, hdr->mname, hdr->fname);
61 if(hdr->ftype == FCORE){
62 if(corpid){
63 fprint(2, "already have corpid %d; ignoring core %s\n", corpid, argv[i]);
64 uncrackhdr(hdr);
65 continue;
66 }
67 if(corhdr){
68 fprint(2, "already have core %s; ignoring core %s\n", corfil, argv[i]);
69 uncrackhdr(hdr);
70 continue;
71 }
72 corhdr = hdr;
73 corfil = argv[i];
74 }else{
75 if(symhdr){
76 fprint(2, "already have text %s; ignoring text %s\n", symfil, argv[i]);
77 uncrackhdr(hdr);
78 continue;
79 }
80 symhdr = hdr;
81 symfil = argv[i];
82 }
83 }
85 if(symhdr == nil){
86 symfil = "a.out"; /* default */
87 if(corpid){ /* try from corpid */
88 if((s = proctextfile(corpid)) != nil){
89 if(verbose)
90 fprint(2, "corpid %d: text %s\n", corpid, s);
91 symfil = s;
92 }
93 }
94 if(corhdr && corhdr->cmdline){ /* try from core */
95 /*
96 * prog gives only the basename of the command,
97 * so try the command line for a path.
98 */
99 if((s = strdup(corhdr->cmdline)) != nil){
100 t = strchr(s, ' ');
101 if(t)
102 *t = 0;
103 if((t = searchpath(s)) != nil){
104 if(verbose)
105 fprint(2, "core: text %s\n", t);
106 symfil = t;
108 free(s);
111 if((symhdr = crackhdr(symfil, omode)) == nil){
112 fprint(2, "crackhdr %s: %r\n", symfil);
113 symfil = nil;
117 if(symhdr)
118 symopen(symhdr);
120 if(!mach)
121 mach = machcpu;
123 /*
124 * Set up maps
125 */
126 symmap = allocmap();
127 cormap = allocmap();
128 if(symmap == nil || cormap == nil)
129 sysfatal("allocating maps: %r");
131 if(symhdr){
132 if(mapfile(symhdr, 0, symmap, nil) < 0)
133 fprint(2, "mapfile %s: %r\n", symfil);
134 mapfile(symhdr, 0, cormap, nil);
137 if(corpid)
138 attachproc(corpid);
139 if(corhdr)
140 attachcore(corhdr);
142 attachdynamic(verbose);
143 return 0;
146 static int thecorpid;
147 static Fhdr *thecorhdr;
149 static void
150 unattach(void)
152 unmapproc(cormap);
153 unmapfile(corhdr, cormap);
154 free(correg);
155 correg = nil;
156 thecorpid = 0;
157 thecorhdr = nil;
158 corpid = 0;
159 corhdr = nil;
160 corfil = nil;
163 int
164 attachproc(int pid)
166 unattach();
167 if(pid == 0)
168 return 0;
169 if(mapproc(pid, cormap, &correg) < 0){
170 fprint(2, "attachproc %d: %r\n", pid);
171 return -1;
173 thecorpid = pid;
174 corpid = pid;
175 return 0;
178 int
179 attachcore(Fhdr *hdr)
181 unattach();
182 if(hdr == nil)
183 return 0;
184 if(mapfile(hdr, 0, cormap, &correg) < 0){
185 fprint(2, "attachcore %s: %r\n", hdr->filename);
186 return -1;
188 thecorhdr = hdr;
189 corhdr = hdr;
190 corfil = hdr->filename;
191 return 0;
194 int
195 attachdynamic(int verbose)
197 extern void elfdl386mapdl(int);
199 if(mach && mach->type == M386 && symhdr && symhdr->elf)
200 elfdl386mapdl(verbose);
201 return 0;