xref: /csrg-svn/old/symorder/symorder.c (revision 623)
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