xref: /original-bsd/old/symorder/symorder.c (revision e74403ba)
1 #ifndef lint
2 static char *sccsid = "@(#)symorder.c	4.4 (Berkeley) 07/02/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 }
152