Commit Diff


commit - 170d47ee1fe2e59a37344025de696bc0d57989bb
commit + 20173464d2169892bde1a91bbfd1c2a811a79ace
blob - 79d8ac08f38e9da5aa430277b06333769af9b5ad
blob + fdd68dfcd4c299769d1688e29921e4c82b0e02e1
--- include/mach.h
+++ include/mach.h
@@ -259,6 +259,7 @@ struct Fhdr
 	void		*dwarf;		/* handle to dwarf image */
 	void		*macho;		/* handle to mach-o image */
 	struct Stab	stabs;
+	char		*cmd;		/* command-line that produced core */
 
 	/* private */
 	Symbol	*sym;		/* cached list of symbols */
blob - d06f139e07f93d5099230b699caef012f1e0ef19
blob + 4da38d9efc33df574f4021696d9f318148a179a1
--- src/libmach/cmdline.c
+++ src/libmach/cmdline.c
@@ -58,6 +58,7 @@ attachargs(int argc, char **argv, int omode)
 		}
 		fprint(2, "%s: %s %s %s\n", argv[i], hdr->aname, hdr->mname, hdr->fname);
 		if(hdr->ftype == FCORE){
+			fprint(2, "core cmd: %s\n", hdr->cmd);
 			if(corpid){
 				fprint(2, "already have corpid %d; ignoring core %s\n", corpid, argv[i]);
 				uncrackhdr(hdr);
blob - f0f84230d5f12fe9079992ccb13f695fc7c84196
blob + 6ed3ee51716c0264a269c807b8c6ca37162d468d
--- src/libmach/crackelf.c
+++ src/libmach/crackelf.c
@@ -6,6 +6,7 @@
 
 static int mapelf(Fhdr *fp, ulong base, Map *map, Regs**);
 static int mapcoreregs(Fhdr *fp, Map *map, Regs**);
+static char *getcorecmd(Fhdr *fp, Map *map);
 
 static struct
 {
@@ -137,6 +138,7 @@ crackelf(int fd, Fhdr *fp)
 			|| ctab[i].mtype != fp->mtype)
 				continue;
 			elf->coreregs = ctab[i].coreregs;
+			elf->corecmd = ctab[i].corecmd;
 			break;
 		}
 		return 0;
@@ -257,6 +259,8 @@ mapelf(Fhdr *fp, ulong base, Map *map, Regs **regs)
 	if(fp->ftype == FCORE){
 		if(mapcoreregs(fp, map, regs) < 0)
 			fprint(2, "warning: reading core regs: %r");
+		if((fp->cmd = getcorecmd(fp, map)) == nil)
+			fprint(2, "warning: reading core command: %r");
 	}
 
 	return 0;	
@@ -345,5 +349,63 @@ mapcoreregs(Fhdr *fp, Map *map, Regs **rp)
 	}
 	fprint(2, "could not find registers in core file\n");
 	return -1;
+}
+
+static char*
+getcorecmd(Fhdr *fp, Map *map)
+{
+	int i;
+	uchar *a, *sa, *ea;
+	char *cmd;
+	uint n;
+	ElfNote note;
+	ElfProg *p;
+	Elf *elf;
+
+	elf = fp->elf;
+	if(elf->corecmd == 0){
+		werrstr("cannot parse %s %s cores", fp->mname, fp->aname);
+		return nil;
+	}
+
+	for(i=0; i<elf->nprog; i++){
+		p = &elf->prog[i];
+		if(p->type != ElfProgNote)
+			continue;
+		n = p->filesz;
+		a = malloc(n);
+		if(a == nil)
+			return nil;
+		if(seek(fp->fd, p->offset, 0) < 0 || readn(fp->fd, a, n) != n){
+			free(a);
+			continue;
+		}
+		sa = a;
+		ea = a+n;
+		while(a < ea){
+			note.offset = (a-sa) + p->offset;
+			if(unpacknote(elf, a, ea, &note, &a) < 0)
+				break;
+			switch(note.type){
+			case ElfNotePrPsinfo:
+				if((n = elf->corecmd(elf, &note, &cmd)) < 0){
+					free(sa);
+					return nil;
+				}
+				free(sa);
+				return cmd;
+			case ElfNotePrStatus:
+			case ElfNotePrFpreg:
+			case ElfNotePrTaskstruct:
+			case ElfNotePrAuxv:
+			case ElfNotePrXfpreg:
+				break;
+			}
+		//	fprint(2, "0x%lux note %s/%lud %p\n", note.offset, note.name, note.type, note.desc);
+		}
+		free(sa);
+	}
+	fprint(2, "could not find registers in core file\n");
+	return nil;
 }
 
blob - 02fb58512f605669ac895c32096acd9ef7f0232c
blob + 6b65cfc86b856817731a86e9c83e1fb6fad0c125
--- src/libmach/elf.h
+++ src/libmach/elf.h
@@ -221,6 +221,7 @@ struct Elf
 	ulong	dynamic;		/* offset to elf dynamic crap */
 
 	int		(*coreregs)(Elf*, ElfNote*, uchar**);
+	int		(*corecmd)(Elf*, ElfNote*, char**);
 };
 
 Elf*	elfopen(char*);