|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: char copyright[] =
9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
10: All rights reserved.\n";
11: #endif not lint
12:
13: #ifndef lint
14: static char sccsid[] = "@(#)symorder.c 5.2 (Berkeley) 7/2/85";
15: #endif not lint
16:
17: /*
18: * symorder - reorder symbol table
19: */
20:
21: #include <stdio.h>
22: #include <sys/types.h>
23: #include <sys/stat.h>
24: #include <a.out.h>
25:
26: #define SPACE 100
27:
28: struct nlist order[SPACE];
29:
30: char *savestr(), *index(), *malloc();
31: struct exec exec;
32: off_t sa;
33: struct stat stb;
34: int nsym = 0;
35: int symfound = 0;
36: char *strings;
37: char *newstrings;
38: struct nlist *symtab;
39: struct nlist *newtab;
40: int symsize;
41: char asym[BUFSIZ];
42:
43: main(argc, argv)
44: char **argv;
45: {
46: register char *ns;
47: register struct nlist *symp;
48: register struct nlist *p;
49: register FILE *f;
50: register int i;
51: int n, o;
52:
53: if (argc != 3) {
54: fprintf(stderr, "Usage: symorder orderlist file\n");
55: exit(1);
56: }
57: if ((f = fopen(argv[1], "r")) == NULL) {
58: perror(argv[1]);
59: exit(1);
60: }
61: for (p = order; fgets(asym, sizeof asym, f) != NULL; p++, nsym++) {
62: for (i = 0; asym[i] && asym[i] != '\n'; i++)
63: continue;
64: if (asym[i] == '\n')
65: asym[i] = 0;
66: p->n_un.n_name = savestr(asym);
67: }
68: fclose(f);
69: if ((f = fopen(argv[2], "r")) == NULL)
70: perror(argv[2]), exit(1);
71: if ((o = open(argv[2], 1)) < 0)
72: perror(argv[2]), exit(1);
73: if ((fread(&exec, sizeof exec, 1, f)) != 1 || N_BADMAG(exec)) {
74: fprintf(stderr, "symorder: %s: bad format\n", argv[2]);
75: exit(1);
76: }
77: if (exec.a_syms == 0) {
78: fprintf(stderr, "symorder: %s is stripped\n", argv[2]);
79: exit(1);
80: }
81: fstat(fileno(f), &stb);
82: if (stb.st_size < N_STROFF(exec)+sizeof(off_t)) {
83: fprintf(stderr, "symorder: %s is in old format or truncated\n",
84: argv[2]);
85: exit(1);
86: }
87: sa = N_SYMOFF(exec);
88: fseek(f, sa, 0);
89: n = exec.a_syms;
90: symtab = (struct nlist *)malloc(n);
91: if (symtab == (struct nlist *)0) {
92: fprintf(stderr, "symorder: Out of core, no space for symtab\n");
93: exit(1);
94: }
95: if (fread((char *)symtab, 1, n, f) != n) {
96: fprintf(stderr, "symorder: Short file "); perror(argv[2]);
97: exit(1);
98: }
99: if (fread((char *)&symsize, sizeof (int), 1, f) != 1 ||
100: symsize <= 0) {
101: fprintf(stderr, "symorder: No strings "); perror(argv[2]);
102: exit(1);
103: }
104: strings = malloc(symsize);
105: if (strings == (char *)0) {
106: fprintf(stderr,"symorder: Out of core, no space for strings\n");
107: exit(1);
108: }
109: /*
110: * Need to subtract four from symsize here since
111: * symsize includes itself, and we've already read
112: * it. (6/30/85 chris@maryland)
113: */
114: if (fread(strings, 1, symsize - 4, f) != symsize - 4) {
115: fprintf(stderr, "symorder: Truncated strings ");
116: perror(argv[2]);
117: exit(1);
118: }
119:
120: newtab = (struct nlist *)malloc(n);
121: if (newtab == (struct nlist *)0) {
122: fprintf(stderr,
123: "symorder: Out of core, no space for new symtab\n");
124: exit(1);
125: }
126: i = n / sizeof (struct nlist);
127: reorder(symtab, newtab, i);
128: free((char *)symtab);
129: symtab = newtab;
130:
131: newstrings = malloc(symsize);
132: if (newstrings == (char *)0) {
133: fprintf(stderr,
134: "symorder: Out of core, no space for newstrings\n");
135: exit(1);
136: }
137: ns = newstrings;
138: for (symp = symtab; --i >= 0; symp++) {
139: if (symp->n_un.n_strx == 0)
140: continue;
141: symp->n_un.n_strx -= sizeof (int);
142: if ((unsigned)symp->n_un.n_strx >= symsize) {
143: fprintf(stderr,"symorder: Corrupted string pointers\n");
144: exit(1);
145: }
146: strcpy(ns, &strings[symp->n_un.n_strx]);
147: symp->n_un.n_strx = (ns - newstrings) + sizeof (int);
148: ns = index(ns, 0) + 1;
149: if (ns > &newstrings[symsize]) {
150: fprintf(stderr, "symorder: Strings grew longer!\n");
151: exit(1);
152: }
153: }
154:
155: lseek(o, sa, 0);
156: if (write(o, (char *)symtab, n) != n) {
157: fprintf(stderr, "symorder: Write failed "); perror(argv[2]);
158: exit(1);
159: }
160: if (write(o, (char *)&symsize, sizeof (int)) != sizeof (int)) {
161: fprintf(stderr, "symorder: Write failed "); perror(argv[2]);
162: exit(1);
163: }
164: if (write(o, newstrings, symsize - 4) != symsize - 4) {
165: fprintf(stderr, "symorder: Write failed "); perror(argv[2]);
166: exit(1);
167: }
168: if ((i = nsym - symfound) > 0) {
169: fprintf(stderr, "symorder: %d symbol%s not found:\n",
170: i, i == 1 ? "" : "s");
171: for (i = 0; i < nsym; i++) {
172: if (order[i].n_value == 0)
173: printf("%s\n", order[i].n_un.n_name);
174: }
175: }
176: exit(0);
177: }
178:
179: reorder(st1, st2, n)
180: register struct nlist *st1, *st2;
181: register n;
182: {
183: register struct nlist *stp = st2 + nsym;
184: register i;
185:
186: while (--n >= 0) {
187: i = inlist(st1);
188: if (i == -1)
189: *stp++ = *st1++;
190: else
191: st2[i] = *st1++;
192: }
193: }
194:
195: inlist(p)
196: register struct nlist *p;
197: {
198: register char *nam;
199: register struct nlist *op;
200:
201: if (p->n_type & N_STAB)
202: return (-1);
203: if (p->n_un.n_strx == 0)
204: return (-1);
205:
206: nam = &strings[p->n_un.n_strx - sizeof(int)];
207: if (nam >= &strings[symsize]) {
208: fprintf(stderr, "symorder: corrupt symtab\n");
209: exit(1);
210: }
211:
212: for (op = &order[nsym]; --op >= order; ) {
213: if (strcmp(op->n_un.n_name, nam) != 0)
214: continue;
215: if (op->n_value == 0) {
216: op->n_value++;
217: symfound++;
218: }
219: return (op - order);
220: }
221: return (-1);
222: }
223:
224: #define NSAVETAB 4096
225: char *savetab;
226: int saveleft;
227:
228: char *
229: savestr(cp)
230: register char *cp;
231: {
232: register int len;
233:
234: len = strlen(cp) + 1;
235: if (len > saveleft) {
236: saveleft = NSAVETAB;
237: if (len > saveleft)
238: saveleft = len;
239: savetab = (char *)malloc(saveleft);
240: if (savetab == 0) {
241: fprintf(stderr,
242: "symorder: ran out of memory (savestr)\n");
243: exit(1);
244: }
245: }
246: strncpy(savetab, cp, len);
247: cp = savetab;
248: savetab += len;
249: saveleft -= len;
250: return (cp);
251: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.