1*623Sbill static char sccsid[] = "@(#)symorder.c 3.1 08/15/80"; 2*623Sbill /* 3*623Sbill * symorder - reorder symbol table 4*623Sbill */ 5*623Sbill #include <stdio.h> 6*623Sbill #include <pagsiz.h> 7*623Sbill #include <sys/types.h> 8*623Sbill #include <stat.h> 9*623Sbill #include <newa.out.h> 10*623Sbill 11*623Sbill #define SPACE 100 12*623Sbill 13*623Sbill struct nlist order[SPACE]; 14*623Sbill 15*623Sbill char *savestr(); 16*623Sbill struct nlist nl1, nl2; 17*623Sbill struct exec exec; 18*623Sbill FILE *strf; 19*623Sbill off_t sa, ss; 20*623Sbill struct stat stb; 21*623Sbill int nsym = 0; 22*623Sbill int symfound = 0; 23*623Sbill char asym[BUFSIZ]; 24*623Sbill 25*623Sbill main(argc, argv) 26*623Sbill char **argv; 27*623Sbill { 28*623Sbill register struct nlist *p, *q; 29*623Sbill register FILE *f; 30*623Sbill register int na, i, j; 31*623Sbill int maxlen; 32*623Sbill int n, o; 33*623Sbill 34*623Sbill if(argc != 3) { 35*623Sbill fprintf(stderr, "Usage: symorder orderlist file\n"); 36*623Sbill exit(1); 37*623Sbill } 38*623Sbill if((f = fopen(argv[1], "r")) == NULL) { 39*623Sbill perror(argv[1]); 40*623Sbill exit(1); 41*623Sbill } 42*623Sbill maxlen = 0; 43*623Sbill for(p = order; fgets(asym, sizeof asym, f) != NULL; p++, nsym++) { 44*623Sbill for(i = 0; asym[i] && asym[i] != '\n'; i++) 45*623Sbill continue; 46*623Sbill if (asym[i] == '\n') 47*623Sbill asym[i] = 0; 48*623Sbill p->n_un.n_name = savestr(asym); 49*623Sbill if (maxlen < strlen(p->n_un.n_name)) 50*623Sbill maxlen = strlen(p->n_un.n_name); 51*623Sbill } 52*623Sbill fclose(f); 53*623Sbill if((f = fopen(argv[2], "r")) == NULL) 54*623Sbill perror(argv[2]), exit(1); 55*623Sbill if((strf = fopen(argv[2], "r")) == NULL) 56*623Sbill perror(argv[2]), exit(1); 57*623Sbill if((o = open(argv[2], 1)) < 0) 58*623Sbill perror(argv[2]), exit(1); 59*623Sbill if((fread(&exec, sizeof exec, 1, f)) != 1 || N_BADMAG(exec)) { 60*623Sbill fprintf(stderr, "symorder: %s: bad format\n", argv[2]); 61*623Sbill exit(1); 62*623Sbill } 63*623Sbill if (exec.a_syms == 0) { 64*623Sbill fprintf(stderr, "symorder: %s is stripped\n", argv[2]); 65*623Sbill exit(1); 66*623Sbill } 67*623Sbill fstat(fileno(f), &stb); 68*623Sbill if (stb.st_size < N_STROFF(exec)+sizeof(off_t)) { 69*623Sbill fprintf(stderr, "symorder: %s is in old format or truncated\n", argv[2]); 70*623Sbill exit(1); 71*623Sbill } 72*623Sbill sa = N_SYMOFF(exec); 73*623Sbill na = sa; 74*623Sbill ss = sa + exec.a_syms; 75*623Sbill fseek(f, sa, 0); 76*623Sbill n = exec.a_syms; 77*623Sbill while(n && symfound < nsym) { 78*623Sbill if(fread(&nl1, sizeof nl1, 1, f) != 1) { 79*623Sbill fprintf(stderr, "Short file "); perror(argv[2]); 80*623Sbill exit(1); 81*623Sbill } 82*623Sbill na += sizeof nl1; 83*623Sbill n -= sizeof nl1; 84*623Sbill if (nl1.n_un.n_strx == 0 || nl1.n_type & N_STAB) 85*623Sbill continue; 86*623Sbill fseek(strf, ss+nl1.n_un.n_strx, 0); 87*623Sbill fread(asym, maxlen+1, 1, strf); 88*623Sbill for(j = 0; j < nsym; j++) { 89*623Sbill for(i = 0; asym[i]; i++) 90*623Sbill if(asym[i] != order[j].n_un.n_name[i]) 91*623Sbill goto cont; 92*623Sbill if (order[j].n_un.n_name[i]) 93*623Sbill goto cont; 94*623Sbill if (order[j].n_value) 95*623Sbill goto cont; 96*623Sbill order[j].n_value = 1; 97*623Sbill fseek(f, (i = (sa+(j * sizeof nl1))), 0); 98*623Sbill if(fread(&nl2, sizeof nl2, 1, f) != 1) 99*623Sbill printf("Read err on 2nd asym\n"); 100*623Sbill lseek(o, i, 0); 101*623Sbill if(write(o, &nl1, sizeof nl1) == -1) 102*623Sbill perror("write1"); 103*623Sbill lseek(o, na-sizeof nl1, 0); 104*623Sbill if(write(o, &nl2, sizeof nl2) == -1) 105*623Sbill perror("write2"); 106*623Sbill fseek(f, 0, 0); 107*623Sbill fseek(f, na, 0); 108*623Sbill symfound++; 109*623Sbill break; 110*623Sbill cont: ; 111*623Sbill 112*623Sbill } 113*623Sbill } 114*623Sbill if(symfound < nsym) { 115*623Sbill fprintf(stderr, "%d symbol(s) not found:\n", nsym - symfound); 116*623Sbill for (i = 0; i < nsym; i++) { 117*623Sbill if (order[i].n_value == 0) 118*623Sbill printf("%s\n", order[i].n_un.n_name); 119*623Sbill } 120*623Sbill } 121*623Sbill } 122*623Sbill 123*623Sbill #define NSAVETAB 4096 124*623Sbill char *savetab; 125*623Sbill int saveleft; 126*623Sbill 127*623Sbill char * 128*623Sbill savestr(cp) 129*623Sbill register char *cp; 130*623Sbill { 131*623Sbill register int len; 132*623Sbill 133*623Sbill len = strlen(cp) + 1; 134*623Sbill if (len > saveleft) { 135*623Sbill saveleft = NSAVETAB; 136*623Sbill if (len > saveleft) 137*623Sbill saveleft = len; 138*623Sbill savetab = (char *)malloc(saveleft); 139*623Sbill if (savetab == 0) { 140*623Sbill fprintf(stderr, 141*623Sbill "symorder: ran out of memory (savestr)\n"); 142*623Sbill exit(1); 143*623Sbill } 144*623Sbill } 145*623Sbill strncpy(savetab, cp, len); 146*623Sbill cp = savetab; 147*623Sbill savetab += len; 148*623Sbill saveleft -= len; 149*623Sbill return (cp); 150*623Sbill } 151