156 lines · 2.5 KB · C
RawDownload
/* * init routines */#include "defs.h"#include "fns.h" char	*symfil;char	*corfil; Map	*symmap;Map	*cormap;Regs	*correg;Map	*dotmap; voidsetsym(void){	if(symhdr && symopen(symhdr) < 0)		dprint("symopen: %r\n");/*	Symbol s;	if (mach->sbreg && lookup(0, mach->sbreg, &s) < 0)		mach->sb = s.loc.addr;*/} voidsetcor(void){	static int mapped; 	if (corhdr) {		if (!mapped) {			if (mapfile(corhdr, 0, cormap, &correg) < 0)				dprint("mapfile %s: %r\n", corfil);			mapped = 1;		}		free(correg);		if (pid == 0 && corhdr->nthread > 0)			pid = corhdr->thread[0].id;		correg = coreregs(corhdr, pid);		if(correg == nil)			dprint("no such pid in core dump\n");	} else {		unmapproc(cormap);		unmapfile(corhdr, cormap);		free(correg);		correg = nil; 		if (pid > 0) {			if (mapproc(pid, cormap, &correg) < 0)				dprint("mapproc %d: %r\n", pid);		} else			dprint("no core image\n");	}	kmsys();	return;} Map*dumbmap(int fd){	Map *dumb;	Seg s; 	dumb = allocmap();	memset(&s, 0, sizeof s);	s.fd = fd;	s.base = 0;	s.offset = 0;	s.size = 0xFFFFFFFF;	s.name = "data";	s.file = "<dumb>";	if(addseg(dumb, s) < 0){		freemap(dumb);		return nil;	}	if(mach == nil)		mach = machcpu;	return dumb;} /* * set up maps for a direct process image (/proc) */voidcmdmap(Map *map){	int i;	char name[MAXSYM]; 	rdc();	readsym(name);	i = findseg(map, name, nil);	if (i < 0)	/* not found */		error("Invalid map name"); 	if (expr(0)) {	/*	if (strcmp(name, "text") == 0) */	/*		textseg(expv, &fhdr); */		map->seg[i].base = expv;	} else		error("Invalid base address"); 	if (expr(0))		map->seg[i].size = expv - map->seg[i].base;	else		error("Invalid end address"); 	if (expr(0))		map->seg[i].offset = expv; 	else		error("Invalid file offset"); /*	if (rdc()=='?' && map == cormap) {		if (fcor)			close(fcor);		fcor=fsym;		corfil = symfil;		cormap = symmap;	} else if (lastc == '/' && map == symmap) {		if (fsym)			close(fsym);		fsym=fcor;		symfil=corfil;		symmap=cormap;	} else		reread();*/} voidkmsys(void){	int i; 	i = findseg(symmap, "text", symfil);	if (i >= 0) {		symmap->seg[i].base = symmap->seg[i].base&~mach->ktmask;		symmap->seg[i].size = -symmap->seg[i].base;	}	i = findseg(symmap, "data", symfil);	if (i >= 0) {		symmap->seg[i].base = symmap->seg[i].base&~mach->ktmask;		symmap->seg[i].size = -symmap->seg[i].base;	}} voidattachprocess(void){	if (!adrflg) {		dprint("usage: pid$a\n");		return;	}	pid = adrval;	setcor();}