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: }

Defined functions

main defined in line 23; never used

Defined variables

aout defined in line 18; used 18 times
newstrb defined in line 20; used 3 times

Defined macros

NEWSIZ defined in line 19; used 2 times
Last modified: 1985-08-14
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1185
Valid CSS Valid XHTML 1.0 Strict