188 lines
3.1 KiB
C
188 lines
3.1 KiB
C
#include <u.h>
|
|
#include <libc.h>
|
|
#include <mach.h>
|
|
|
|
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 i;
|
|
Fhdr *hdr;
|
|
char *s;
|
|
|
|
symhdr = nil;
|
|
corhdr = nil;
|
|
symfil = nil;
|
|
corfil = nil;
|
|
corpid = 0;
|
|
correg = nil;
|
|
|
|
for(i=0; i<argc; i++){
|
|
if(alldigs(argv[i])){
|
|
if(corpid){
|
|
fprint(2, "already have corpid %d; ignoring corpid %d\n", corpid, argv[i]);
|
|
continue;
|
|
}
|
|
if(corhdr){
|
|
fprint(2, "already have core %s; ignoring corpid %d\n", corfil, corpid);
|
|
continue;
|
|
}
|
|
corpid = atoi(argv[i]);
|
|
continue;
|
|
}
|
|
if((hdr = crackhdr(argv[i], omode)) == nil){
|
|
fprint(2, "crackhdr %s: %r\n", argv[i]);
|
|
continue;
|
|
}
|
|
fprint(2, "%s: %s %s %s\n", argv[i], hdr->aname, 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){
|
|
fprint(2, "corpid %d: text %s\n", corpid, s);
|
|
symfil = s;
|
|
}
|
|
}
|
|
if(corhdr){ /* try from core */
|
|
if(corhdr->txtfil != nil){
|
|
fprint(2, "core %s: text %s\n", corfil, corhdr->txtfil);
|
|
symfil = corhdr->txtfil;
|
|
}
|
|
}
|
|
if((symhdr = crackhdr(symfil, omode)) == nil){
|
|
fprint(2, "crackhdr %s: %r\n", symfil);
|
|
symfil = nil;
|
|
}
|
|
}
|
|
|
|
if(symhdr)
|
|
syminit(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);
|
|
|
|
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(corhdr == 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(void)
|
|
{
|
|
extern void elfdl386mapdl(void);
|
|
elfdl386mapdl();
|
|
return 0;
|
|
}
|
|
|