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