1: static char * 2: RcsId = "$Header: /usr/src/local/RCS/buildcore.c,v 1.2 83/04/26 21:24:33 crl Exp $"; 3: 4: /* 5: * buildcore - rebuild an executable file from a core image 6: */ 7: 8: #include <stdio.h> 9: #include <a.out.h> 10: #include <sys/param.h> 11: #include <sys/stat.h> 12: #undef DIRSIZ 13: #include <dir.h> 14: #include <sys/user.h> 15: 16: char *efilename; /* executable filename */ 17: char *cfilename = "core"; /* core filename */ 18: char *afilename = "a.out"; /* new executable file */ 19: FILE *efile; 20: FILE *cfile; 21: FILE *afile; /* a.out */ 22: char *progname; /* our name */ 23: unsigned olddata; /* size of data in executable */ 24: struct user u; /* copy of user structure */ 25: struct exec e; /* a.out header */ 26: struct stat sbuf; /* for stat */ 27: struct ovlhdr overlay; /* overlay header */ 28: 29: char *rindex(); 30: FILE *fopen(); 31: 32: main(argc, argv) 33: int argc; 34: char *argv[]; 35: { 36: register unsigned i; 37: register unsigned j; 38: register c; 39: 40: if ((progname = rindex(argv[0], '/')) == NULL) 41: progname = argv[0]; 42: else 43: progname++; 44: 45: if (argc != 2) { 46: fprintf(stderr, "usage: %s file\n", progname); 47: exit(1); 48: } 49: efilename = argv[1]; 50: if ((efile = fopen(efilename, "r")) == NULL) { 51: fprintf(stderr, "%s: can't read %s\n", progname, efilename); 52: exit(1); 53: } 54: if ((cfile = fopen(cfilename, "r")) == NULL) { 55: fprintf(stderr, "%s: can't read %s\n", progname, cfilename); 56: exit(1); 57: } 58: if ((afile = fopen(afilename, "w")) == NULL) { 59: fprintf(stderr, "%s: can't write %s\n", progname, afilename); 60: exit(1); 61: } 62: if (fread(&u, sizeof u, 1, cfile) != 1) { 63: fprintf(stderr, "%s: error reading user structure\n", 64: progname); 65: exit(1); 66: } 67: fseek(cfile, (long)ctob(USIZE), 0); /* seek past all of user area */ 68: if (fread(&e, sizeof e, 1, efile) != 1) { 69: fprintf(stderr, "%s: error reading old exec header\n", 70: progname); 71: exit(1); 72: } 73: 74: /* 75: * check for a support magic number 76: */ 77: switch(e.a_magic) { 78: case A_MAGIC1: /* normal */ 79: case A_MAGIC4: /* manual overlay */ 80: case A_MAGIC5: /* non-sep auto overlay */ 81: fprintf(stderr, "%s: unsupported executable type %o\n", 82: progname, e.a_magic); 83: exit(1); 84: } 85: /* 86: * build the a.out header 87: */ 88: olddata = e.a_data; /* save it for an offset */ 89: e.a_data = ctob(u.u_dsize); /* get new data size from core */ 90: e.a_bss = 0; /* can't use bss anymore */ 91: 92: if (fwrite(&e, sizeof e, 1, afile) != 1) { 93: fprintf(stderr, "%s: error in writing %s header\n", 94: progname, afilename); 95: exit(1); 96: } 97: /* 98: * write out overlay header if overlayed 99: */ 100: if (e.a_magic == A_MAGIC6) { 101: if (fread(&overlay, sizeof overlay, 1, efile) != 1) { 102: fprintf(stderr, "%s: error reading overlay header\n", 103: progname); 104: exit(1); 105: } 106: if (fwrite(&overlay, sizeof overlay, 1, afile) != 1) { 107: fprintf(stderr, "%s: error writing overlay header\n", 108: progname); 109: exit(1); 110: } 111: } 112: /* 113: * now write out the base text segment 114: */ 115: i = e.a_text; 116: if (i) do { 117: if ((c = getc(efile)) == EOF) { 118: fprintf(stderr, "%s: unexpected EOF reading base text segment\n", progname); 119: exit(1); 120: } 121: putc(c, afile); 122: } while (--i); 123: /* 124: * write out overlays 125: */ 126: if (e.a_magic == A_MAGIC6) { 127: for (i = 0; overlay.ov_siz[i] != 0 && i < NOVL; i++) { 128: j = overlay.ov_siz[i]; 129: do { 130: if ((c = getc(efile)) == EOF) { 131: fprintf(stderr, "%s: unexpected EOF reading overlays \n", progname); 132: exit(1); 133: } 134: putc(c, afile); 135: } while (--j); 136: } 137: } 138: /* 139: * and the new data segment 140: */ 141: i = ctob(u.u_dsize); 142: if (i) do { 143: if ((c = getc(cfile)) == EOF) { 144: fprintf(stderr, "%s: unexpected EOF reading core data, i = %d\n", progname, i); 145: exit(1); 146: } 147: putc(c, afile); 148: } while (--i); 149: /* 150: * skip over the data segment in the executable 151: * and copy the rest of the file to the new a.out 152: */ 153: fseek(efile, (long) olddata, 1); 154: while((c = getc(efile)) != EOF) 155: putc(c, afile); 156: /* 157: * make the new file executable 158: */ 159: fstat(fileno(afile), &sbuf); 160: if ((sbuf.st_mode & 0111) == 0) { 161: sbuf.st_mode |= 0111; 162: chmod(afilename, sbuf.st_mode); 163: } 164: }