hcj@lzaz.ATT.COM (HC Johnson) (02/27/89)
This tool makes a mwc 3 executable look like a DRI or mwc 2 version. Distomwc cannot disassembel a mwc 3 format. --This compiles on mwc. Howard C. Johnson ATT Bell Labs att!lzaz!hcj hcj@lzaz.att.com ==============================cut here======================== /* * use to strip mwc 3.0 exec files to allow disassembly */ #include <stdio.h> #include <gemout.h> #include <stat.h> main(argc,argv) char **argv; { long lseek(); struct stat xstat; struct gemohdr header; char *name_in,*name_out; long filelen; long address; FILE *fin,*fout; int ret; long tmp; long offset; if(argc != 3) { fprintf(stderr,"Usage: %s file_in file_out\nStrip symbol and debugging info from mwc 3.0\n",argv[0]); exit(1); } name_in = argv[1]; name_out = argv[2]; if(stat(name_in,&xstat) < 0) { perror(""); fprintf(stderr,"Cannot open %s\n",name_in); exit(1); } filelen = xstat.st_size; if((fin = fopen(name_in,"rb")) == 0) { perror(""); fprintf(stderr,"Cannot open %s\n",name_in); exit(1); } ret = fread(&header,sizeof(header),1,fin); if(ret == 0) { printf("Error reading header\n"); goto error; } if((fout = fopen(name_out,"wb")) == 0) { perror(""); fprintf(stderr,"Cannot open %s\n",name_out); exit(1); } offset =header.g_ssize[GO_TEXT] + header.g_ssize[GO_DATA] + header.g_ssize[GO_SYM] + sizeof(header); tmp = header.g_ssize[GO_SYM] > 0x30L? 0x30L:header.g_ssize[GO_SYM]; tmp = header.g_ssize[GO_SYM] ; fprintf(stderr,"File Sizes: Text = %X, Data = %X Sym = %X New Sym = %X\n", header.g_ssize[GO_TEXT], header.g_ssize[GO_DATA], header.g_ssize[GO_SYM], header.g_ssize[GO_SYM]-tmp); if(filelen - offset < 0) { fprintf(stderr,"size error: filelen = %D, size = %D\n",filelen,offset); exit(1); } header.g_ssize[GO_SYM] -= tmp; /* if(header.g_ssize[GO_SYM]) { header.g_relflag = 1; } */ ret = fwrite(&header,sizeof(header),1,fout); if(ret == 0) { printf("Error writing header\n"); goto error; } copy(fin,fout,header.g_ssize[GO_TEXT]); copy(fin,fout,header.g_ssize[GO_DATA]); if(tmp) fseek(fin,(long)tmp,1); /* skip over 0x30 bytes */ copy(fin,fout,header.g_ssize[GO_SYM]); /* copy balance of symbols */ address = filelen - offset; /* net relo size */ copy(fin,fout,address); fclose(fin); fclose(fout); exit(0); error: perror(""); printf("Error in File %s\n",name_in); fprintf(stderr,"Error in File %s\n",name_in); exit(1); } copy(fin,fout,lsize) FILE *fin,*fout; long lsize; { char *space; short size; int ret; fprintf(stderr,"Copy %D\n",lsize); if(!lsize) return; space = malloc(lsize>0xfffeL?0xfffe:(short)lsize); if(!space) { printf("Cannot allocate %D bytes\n",size); exit(1); } while(lsize) { size = lsize>0xfffeL?0xfffe:(short)lsize; lsize -= size; ret = fread(space,size,1,fin); if(ret == 0) { perror(""); printf("Error reading input file\n"); exit(1); } ret = fwrite(space,size,1,fout); if(ret == 0) { perror(""); printf("Error writing output file\n"); exit(1); } } free(space); }