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