|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)symorder.c 4.4 (Berkeley) 7/2/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.