#include #include #include Fhdr *symhdr; Fhdr *corhdr; char *symfil; char *corfil; int corpid; Regs *correg; Map *symmap; Map *cormap; static int alldigs(char *s) { while(*s){ if(*s<'0' || '9'<*s) return 0; s++; } return 1; } /* * attach to arguments in argc, argv */ int attachargs(int argc, char **argv, int omode, int verbose) { int i; Fhdr *hdr; char *s, *t; symhdr = nil; corhdr = nil; symfil = nil; corfil = nil; corpid = 0; correg = nil; for(i=0; ianame, hdr->mname, hdr->fname); if(hdr->ftype == FCORE){ if(corpid){ fprint(2, "already have corpid %d; ignoring core %s\n", corpid, argv[i]); uncrackhdr(hdr); continue; } if(corhdr){ fprint(2, "already have core %s; ignoring core %s\n", corfil, argv[i]); uncrackhdr(hdr); continue; } corhdr = hdr; corfil = argv[i]; }else{ if(symhdr){ fprint(2, "already have text %s; ignoring text %s\n", symfil, argv[i]); uncrackhdr(hdr); continue; } symhdr = hdr; symfil = argv[i]; } } if(symhdr == nil){ symfil = "a.out"; /* default */ if(corpid){ /* try from corpid */ if((s = proctextfile(corpid)) != nil){ if(verbose) fprint(2, "corpid %d: text %s\n", corpid, s); symfil = s; } } if(corhdr && corhdr->cmdline){ /* try from core */ /* * prog gives only the basename of the command, * so try the command line for a path. */ if((s = strdup(corhdr->cmdline)) != nil){ t = strchr(s, ' '); if(t) *t = 0; if((t = searchpath(s)) != nil){ if(verbose) fprint(2, "core: text %s\n", t); symfil = t; } free(s); } } if((symhdr = crackhdr(symfil, omode)) == nil){ fprint(2, "crackhdr %s: %r\n", symfil); symfil = nil; } } if(symhdr) symopen(symhdr); if(!mach) mach = machcpu; /* * Set up maps */ symmap = allocmap(); cormap = allocmap(); if(symmap == nil || cormap == nil) sysfatal("allocating maps: %r"); if(symhdr){ if(mapfile(symhdr, 0, symmap, nil) < 0) fprint(2, "mapfile %s: %r\n", symfil); mapfile(symhdr, 0, cormap, nil); } if(corpid) attachproc(corpid); if(corhdr) attachcore(corhdr); attachdynamic(verbose); return 0; } static int thecorpid; static Fhdr *thecorhdr; static void unattach(void) { unmapproc(cormap); unmapfile(corhdr, cormap); free(correg); correg = nil; thecorpid = 0; thecorhdr = nil; corpid = 0; corhdr = nil; corfil = nil; } int attachproc(int pid) { unattach(); if(pid == 0) return 0; if(mapproc(pid, cormap, &correg) < 0){ fprint(2, "attachproc %d: %r\n", pid); return -1; } thecorpid = pid; corpid = pid; return 0; } int attachcore(Fhdr *hdr) { unattach(); if(hdr == nil) return 0; if(mapfile(hdr, 0, cormap, &correg) < 0){ fprint(2, "attachcore %s: %r\n", hdr->filename); return -1; } thecorhdr = hdr; corhdr = hdr; corfil = hdr->filename; return 0; } int attachdynamic(int verbose) { extern void elfdl386mapdl(int); if(mach && mach->type == M386 && symhdr && symhdr->elf) elfdl386mapdl(verbose); return 0; }