|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "lconf.h" ! 3: #include "config.h" ! 4: #if ! os_unisoft ! 5: #include <sys/types.h> ! 6: #include <a.out.h> ! 7: /* ! 8: * $Header: /na/franz/utils/RCS/tackon.c,v 1.4 83/08/22 19:01:17 sklower Exp $ ! 9: * ! 10: * $Locker: $ ! 11: * ! 12: * This program tacks on extra symbols into the symbol table. ! 13: * someone should write one for system 5. ! 14: * ! 15: */ ! 16: ! 17: FILE *map; ! 18: int aout; ! 19: #define NEWSIZ 100000 ! 20: char newstrb[NEWSIZ]; ! 21: ! 22: #endif ! 23: main(argc, argv) ! 24: int argc; ! 25: char *argv[]; ! 26: { ! 27: #if ! os_unisoft ! 28: char sym[50], svalue[50]; ! 29: char *strb,*newstr,*malloc(); ! 30: char *curstr; ! 31: int value; ! 32: int cnt; ! 33: int strsiz; ! 34: int strcnt; ! 35: int size; ! 36: int header_location; ! 37: struct nlist a; ! 38: struct exec e; ! 39: ! 40: argc--, argv++; ! 41: if (argc == 0 || argc > 2) { ! 42: usage: ! 43: fprintf(stderr, "usage: tackon map [ a.out ]\n"); ! 44: exit(1); ! 45: } ! 46: map = fopen(argv[0], "r"); ! 47: if (map == NULL) { ! 48: perror(argv[0]); ! 49: exit(1); ! 50: } ! 51: aout = open(argc == 2 ? argv[1] : "a.out", 2); ! 52: if ((aout < 0) && (argc == 2)) { ! 53: char Name[256]; ! 54: ! 55: strcpy(Name,argv[1]); ! 56: strcat(Name,".exe"); ! 57: aout = open(Name,2); ! 58: } ! 59: if (aout < 0) { ! 60: printf(" No object file to tackon or text busy\n"); ! 61: exit(1); ! 62: } ! 63: header_location = 0; ! 64: read(aout,&e, sizeof(e)); ! 65: if (N_BADMAG(e)) { ! 66: header_location = 512; ! 67: lseek(aout,512,0); ! 68: read(aout,&e,sizeof(e)); ! 69: if (N_BADMAG(e)) { ! 70: printf("tackon: bad magic number\n"); ! 71: exit(0); ! 72: } ! 73: } ! 74: /* read current string table into buffer */ ! 75: lseek(aout, N_STROFF(e), 0); /* seek to string table beginning */ ! 76: read(aout,&strsiz,4); /* read in string table size */ ! 77: strb = malloc(strsiz); ! 78: read(aout,strb,strsiz); /* read in string table */ ! 79: lseek(aout, N_STROFF(e), 0); /* now write at end of symbols */ ! 80: cnt = 0; ! 81: strcnt = 4 + strsiz; ! 82: curstr = newstrb; /* point to new string buffer */ ! 83: for (;;) { ! 84: if (fgets(sym, 50, map) == NULL) ! 85: break; ! 86: sym[size=strlen(sym)-1] = 0; ! 87: if (fgets(svalue, 50, map) == NULL) { ! 88: fprintf(stderr, "missing value\n"); ! 89: break; ! 90: } ! 91: strcpy(curstr,sym); ! 92: sscanf(svalue, "%x", &a.n_value); ! 93: a.n_un.n_strx = strcnt; ! 94: a.n_type = N_EXT|N_TEXT; ! 95: write(aout, &a, sizeof (a)); ! 96: curstr += size+1; ! 97: strcnt += size+1; ! 98: cnt++; ! 99: if( curstr >= &newstrb[NEWSIZ]) ! 100: { ! 101: printf(" Tackon; string buffer overflow \n"); ! 102: exit(1); ! 103: } ! 104: } ! 105: write(aout, &strcnt, 4); /* new character count */ ! 106: write(aout, strb, strsiz); /* write out old string table */ ! 107: write(aout, newstrb, strcnt - ( 4 + strsiz)); ! 108: lseek(aout, header_location, 0); ! 109: e.a_syms += cnt*sizeof(struct nlist); ! 110: lseek(aout, header_location, 0); ! 111: write(aout, &e, sizeof (e)); ! 112: exit(0); ! 113: #endif ! 114: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.