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>
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;
14 bdfd1b27 2005-01-07 devnull static int
15 e8a7b969 2004-12-27 devnull alldigs(char *s)
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;
22 e8a7b969 2004-12-27 devnull return 1;
26 e8a7b969 2004-12-27 devnull * attach to arguments in argc, argv
29 dd944ec7 2005-01-23 devnull attachargs(int argc, char **argv, int omode, int verbose)
32 e8a7b969 2004-12-27 devnull Fhdr *hdr;
33 dd944ec7 2005-01-23 devnull char *s, *t;
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;
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;
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;
52 e8a7b969 2004-12-27 devnull corpid = atoi(argv[i]);
53 e8a7b969 2004-12-27 devnull continue;
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;
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;
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;
72 e8a7b969 2004-12-27 devnull corhdr = hdr;
73 e8a7b969 2004-12-27 devnull corfil = argv[i];
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;
80 e8a7b969 2004-12-27 devnull symhdr = hdr;
81 e8a7b969 2004-12-27 devnull symfil = argv[i];
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;
94 dd944ec7 2005-01-23 devnull if(corhdr && corhdr->cmdline){ /* try from core */
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.
99 dd944ec7 2005-01-23 devnull if((s = strdup(corhdr->cmdline)) != nil){
100 dd944ec7 2005-01-23 devnull t = strchr(s, ' ');
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;
108 dd944ec7 2005-01-23 devnull free(s);
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;
117 e8a7b969 2004-12-27 devnull if(symhdr)
118 0a76e969 2005-01-07 devnull symopen(symhdr);
120 e8a7b969 2004-12-27 devnull if(!mach)
121 e8a7b969 2004-12-27 devnull mach = machcpu;
124 e8a7b969 2004-12-27 devnull * Set up maps
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");
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);
137 e8a7b969 2004-12-27 devnull 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);
142 dd944ec7 2005-01-23 devnull attachdynamic(verbose);
143 e8a7b969 2004-12-27 devnull return 0;
146 e8a7b969 2004-12-27 devnull static int thecorpid;
147 e8a7b969 2004-12-27 devnull static Fhdr *thecorhdr;
149 e8a7b969 2004-12-27 devnull static void
150 e8a7b969 2004-12-27 devnull unattach(void)
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;
164 e8a7b969 2004-12-27 devnull attachproc(int pid)
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;
173 e8a7b969 2004-12-27 devnull thecorpid = pid;
174 e8a7b969 2004-12-27 devnull corpid = pid;
175 e8a7b969 2004-12-27 devnull return 0;
179 e8a7b969 2004-12-27 devnull attachcore(Fhdr *hdr)
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;
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;
195 dd944ec7 2005-01-23 devnull attachdynamic(int verbose)
197 dd944ec7 2005-01-23 devnull extern void elfdl386mapdl(int);
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;