xref: /original-bsd/old/symorder/symorder.c (revision ba72ef4c)
1 static char *sccsid = "@(#)symorder.c	4.2 (Berkeley) 10/02/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 }
151