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 e8a7b969 2004-12-27 devnull attachargs(int argc, char **argv, int omode)
32 e8a7b969 2004-12-27 devnull Fhdr *hdr;
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 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;
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;
71 e8a7b969 2004-12-27 devnull corhdr = hdr;
72 e8a7b969 2004-12-27 devnull corfil = argv[i];
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;
79 e8a7b969 2004-12-27 devnull symhdr = hdr;
80 e8a7b969 2004-12-27 devnull symfil = argv[i];
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;
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;
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;
104 e8a7b969 2004-12-27 devnull if(symhdr)
105 0a76e969 2005-01-07 devnull symopen(symhdr);
107 e8a7b969 2004-12-27 devnull if(!mach)
108 e8a7b969 2004-12-27 devnull mach = machcpu;
111 e8a7b969 2004-12-27 devnull * Set up maps
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");
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);
124 e8a7b969 2004-12-27 devnull if(corpid)
125 e8a7b969 2004-12-27 devnull attachproc(corpid);
127 e8a7b969 2004-12-27 devnull if(corhdr)
128 e8a7b969 2004-12-27 devnull attachcore(corhdr);
130 e8a7b969 2004-12-27 devnull return 0;
133 e8a7b969 2004-12-27 devnull static int thecorpid;
134 e8a7b969 2004-12-27 devnull static Fhdr *thecorhdr;
136 e8a7b969 2004-12-27 devnull static void
137 e8a7b969 2004-12-27 devnull unattach(void)
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;
151 e8a7b969 2004-12-27 devnull attachproc(int pid)
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;
160 e8a7b969 2004-12-27 devnull thecorpid = pid;
161 e8a7b969 2004-12-27 devnull corpid = pid;
162 e8a7b969 2004-12-27 devnull return 0;
166 e8a7b969 2004-12-27 devnull attachcore(Fhdr *hdr)
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;
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;
182 e8a7b969 2004-12-27 devnull attachdynamic(void)
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;