xref: /openbsd-src/usr.sbin/crunchgen/elf_hide.c (revision 9f79a69831e4879318a9c62b1da26ebbbfc9edc0)
1*9f79a698Smpi /* $OpenBSD: elf_hide.c,v 1.11 2017/10/29 08:45:53 mpi Exp $ */
2cbf5262eSderaadt 
3cbf5262eSderaadt /*
4cbf5262eSderaadt  * Copyright (c) 1997 Dale Rahn.
5cbf5262eSderaadt  * All rights reserved.
6cbf5262eSderaadt  *
7cbf5262eSderaadt  *
8cbf5262eSderaadt  * Redistribution and use in source and binary forms, with or without
9cbf5262eSderaadt  * modification, are permitted provided that the following conditions
10cbf5262eSderaadt  * are met:
11cbf5262eSderaadt  * 1. Redistributions of source code must retain the above copyright
12cbf5262eSderaadt  *    notice, this list of conditions and the following disclaimer.
13cbf5262eSderaadt  * 2. Redistributions in binary form must reproduce the above copyright
14cbf5262eSderaadt  *    notice, this list of conditions and the following disclaimer in the
15cbf5262eSderaadt  *    documentation and/or other materials provided with the distribution.
16cbf5262eSderaadt  *
17cbf5262eSderaadt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18cbf5262eSderaadt  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19cbf5262eSderaadt  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20cbf5262eSderaadt  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21cbf5262eSderaadt  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22cbf5262eSderaadt  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23cbf5262eSderaadt  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24cbf5262eSderaadt  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25cbf5262eSderaadt  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26cbf5262eSderaadt  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27cbf5262eSderaadt  */
28cbf5262eSderaadt 
29cbf5262eSderaadt #include <sys/types.h>
30cbf5262eSderaadt #include <sys/mman.h>
31cbf5262eSderaadt #include <sys/stat.h>
323800d98fSguenther 
33*9f79a698Smpi #include <elf.h>
34cbf5262eSderaadt #include <err.h>
35cbf5262eSderaadt #include <errno.h>
36cbf5262eSderaadt #include <fcntl.h>
37cbf5262eSderaadt #include <unistd.h>
38cbf5262eSderaadt #include <stdio.h>
39cbf5262eSderaadt #include <stdlib.h>
40cbf5262eSderaadt #include <string.h>
41516251d4Sdrahn #include "mangle.h"
42516251d4Sdrahn 
4303ab18c2Sdrahn extern	int elf_mangle;
4403ab18c2Sdrahn 
45cbf5262eSderaadt void	load_strtab(Elf_Ehdr * pehdr, char *pexe);
46525e9a87Sderaadt void	dump_strtab(void);
47cbf5262eSderaadt char	*get_str(int indx);
48cbf5262eSderaadt 
49cbf5262eSderaadt void	load_symtab(Elf_Ehdr * pehdr, char *pexe);
50525e9a87Sderaadt void	dump_symtab(Elf_Shdr * symsect, Elf_Sym * symtab, int symtabsize);
51525e9a87Sderaadt void	fprint_str(FILE * channel, int indx);
52cbf5262eSderaadt 
53cbf5262eSderaadt void	load_shstr_tab(Elf_Ehdr * pehdr, char *pexe);
54cbf5262eSderaadt char	*get_shstr(int indx);
55cbf5262eSderaadt void	fprint_shstr(FILE * channel, int indx);
56cbf5262eSderaadt 
57525e9a87Sderaadt void	hide_sym(Elf_Ehdr * ehdr, Elf_Shdr * symsect,
58525e9a87Sderaadt 	    Elf_Sym * symtab, int symtabsize, int symtabsecnum);
59cbf5262eSderaadt void	reorder_syms(Elf_Ehdr * ehdr, Elf_Shdr * symsect,
60cbf5262eSderaadt 	    Elf_Sym * symtab, int symtabsize, int symtabsecnum);
61cbf5262eSderaadt typedef long    Symmap;
62cbf5262eSderaadt void	renum_reloc_syms(Elf_Ehdr * ehdr, Symmap * symmap,
63cbf5262eSderaadt 	    int symtabsecnum);
64525e9a87Sderaadt void	elf_hide(int pfile, char *p);
65cbf5262eSderaadt 
66cbf5262eSderaadt 
67cbf5262eSderaadt char           *pexe;
68cbf5262eSderaadt 
69cbf5262eSderaadt void
elf_hide(int pfile,char * p)70cbf5262eSderaadt elf_hide(int pfile, char *p)
71cbf5262eSderaadt {
72cbf5262eSderaadt 	Elf_Ehdr       *pehdr;
73cbf5262eSderaadt #ifdef DEBUG
74cbf5262eSderaadt 	Elf_Shdr       *pshdr;
75cbf5262eSderaadt 	Elf_Phdr       *pphdr;
76cbf5262eSderaadt 	int             i;
77cbf5262eSderaadt #endif
78cbf5262eSderaadt 
79cbf5262eSderaadt 	pexe = p;
80cbf5262eSderaadt 	pehdr = (Elf_Ehdr *) pexe;
81cbf5262eSderaadt 
82cbf5262eSderaadt #ifdef DEBUG
83cbf5262eSderaadt 	printf("elf header\n");
84cbf5262eSderaadt 	printf("e_type %x\n", pehdr->e_type);
85cbf5262eSderaadt 	printf("e_machine %x\n", pehdr->e_machine);
86cbf5262eSderaadt 	printf("e_version %x\n", pehdr->e_version);
87cbf5262eSderaadt 	printf("e_entry %x\n", pehdr->e_entry);
88cbf5262eSderaadt 	printf("e_phoff %x\n", pehdr->e_phoff);
89cbf5262eSderaadt 	printf("e_shoff %x\n", pehdr->e_shoff);
90cbf5262eSderaadt 	printf("e_flags %x\n", pehdr->e_flags);
91cbf5262eSderaadt 	printf("e_ehsize %x\n", pehdr->e_ehsize);
92cbf5262eSderaadt 	printf("e_phentsize %x\n", pehdr->e_phentsize);
93cbf5262eSderaadt 	printf("e_phnum %x\n", pehdr->e_phnum);
94cbf5262eSderaadt 	printf("e_shentsize %x\n", pehdr->e_shentsize);
95cbf5262eSderaadt 	printf("e_shnum %x\n", pehdr->e_shnum);
96cbf5262eSderaadt 	printf("e_shstrndx %x\n", pehdr->e_shstrndx);
97cbf5262eSderaadt #endif
98cbf5262eSderaadt 
99cbf5262eSderaadt 	load_shstr_tab(pehdr, pexe);
100cbf5262eSderaadt #ifdef DEBUG
101cbf5262eSderaadt 	for (i = 0; i < pehdr->e_shnum; i++) {
102cbf5262eSderaadt 		pshdr = (Elf_Phdr *) (pexe + pehdr->e_shoff +
103cbf5262eSderaadt 		    (i * pehdr->e_shentsize));
104cbf5262eSderaadt 
105cbf5262eSderaadt 		printf("section header %d\n", i);
106cbf5262eSderaadt 		printf("sh_name %x ", pshdr->sh_name);
107cbf5262eSderaadt 		fprint_shstr(stdout, pshdr->sh_name);
108cbf5262eSderaadt 		printf("\n");
109cbf5262eSderaadt 		printf("sh_type %x\n", pshdr->sh_type);
110cbf5262eSderaadt 		printf("sh_flags %x\n", pshdr->sh_flags);
111cbf5262eSderaadt 		printf("sh_addr %x\n", pshdr->sh_addr);
112cbf5262eSderaadt 		printf("sh_offset %x\n", pshdr->sh_offset);
113cbf5262eSderaadt 		printf("sh_size %x\n", pshdr->sh_size);
114cbf5262eSderaadt 		printf("sh_link %x\n", pshdr->sh_link);
115cbf5262eSderaadt 		printf("sh_info %x\n", pshdr->sh_info);
116cbf5262eSderaadt 		printf("sh_addralign %x\n", pshdr->sh_addralign);
117cbf5262eSderaadt 		printf("sh_entsize %x\n", pshdr->sh_entsize);
118cbf5262eSderaadt 	}
119cbf5262eSderaadt #endif				/* DEBUG */
120cbf5262eSderaadt 
121cbf5262eSderaadt #ifdef DEBUG
122cbf5262eSderaadt 	for (i = 0; i < pehdr->e_phnum; i++) {
123cbf5262eSderaadt 		pshdr = (Elf_Phdr *) (pexe + pehdr->e_phoff +
124cbf5262eSderaadt 		    (i * pehdr->e_phentsize));
125cbf5262eSderaadt 
126cbf5262eSderaadt 		printf("program header %d\n", i);
127cbf5262eSderaadt 		printf("p_type %x\n", pphdr->p_type);
128cbf5262eSderaadt 		printf("p_offset %x\n", pphdr->p_offset);
129cbf5262eSderaadt 		printf("p_vaddr %x\n", pphdr->p_vaddr);
130cbf5262eSderaadt 		printf("p_paddr %x\n", pphdr->p_paddr);
131cbf5262eSderaadt 		printf("p_filesz %x\n", pphdr->p_filesz);
132cbf5262eSderaadt 		printf("p_memsz %x\n", pphdr->p_memsz);
133cbf5262eSderaadt 		printf("p_flags %x\n", pphdr->p_flags);
134cbf5262eSderaadt 		printf("p_align %x\n", pphdr->p_align);
135cbf5262eSderaadt 	}
136cbf5262eSderaadt #endif				/* DEBUG */
137cbf5262eSderaadt #if 0
138cbf5262eSderaadt 	for (i = 0; i < pehdr->e_shnum; i++) {
139cbf5262eSderaadt 		pshdr = (Elf_Phdr *) (pexe + pehdr->e_shoff +
140cbf5262eSderaadt 		    (i * pehdr->e_shentsize));
141cbf5262eSderaadt 		if (strcmp(".strtab", get_shstr(pshdr->sh_name)) == 0)
142cbf5262eSderaadt 			break;
143cbf5262eSderaadt 	}
144cbf5262eSderaadt 	fprint_shstr(stdout, pshdr->sh_name);
145cbf5262eSderaadt 	printf("\n");
146cbf5262eSderaadt #endif
147cbf5262eSderaadt 
148cbf5262eSderaadt 	load_strtab(pehdr, pexe);
149cbf5262eSderaadt 	load_symtab(pehdr, pexe);
150cbf5262eSderaadt 	close(pfile);
151cbf5262eSderaadt }
152cbf5262eSderaadt char           *shstrtab;
153cbf5262eSderaadt 
154cbf5262eSderaadt void
load_shstr_tab(Elf_Ehdr * pehdr,char * pexe)155cbf5262eSderaadt load_shstr_tab(Elf_Ehdr * pehdr, char *pexe)
156cbf5262eSderaadt {
157cbf5262eSderaadt 	Elf_Shdr       *pshdr;
158cbf5262eSderaadt 	shstrtab = NULL;
159cbf5262eSderaadt 	if (pehdr->e_shstrndx == 0)
160cbf5262eSderaadt 		return;
161cbf5262eSderaadt 	pshdr = (Elf_Shdr *) (pexe + pehdr->e_shoff +
162cbf5262eSderaadt 	    (pehdr->e_shstrndx * pehdr->e_shentsize));
163cbf5262eSderaadt 
164cbf5262eSderaadt 	shstrtab = (char *) (pexe + pshdr->sh_offset);
165cbf5262eSderaadt }
166cbf5262eSderaadt 
167cbf5262eSderaadt void
fprint_shstr(FILE * channel,int indx)168cbf5262eSderaadt fprint_shstr(FILE * channel, int indx)
169cbf5262eSderaadt {
170cbf5262eSderaadt 	if (shstrtab != NULL)
171cbf5262eSderaadt 		fprintf(channel, "\"%s\"", &(shstrtab[indx]));
172cbf5262eSderaadt }
173cbf5262eSderaadt 
174cbf5262eSderaadt char           *
get_shstr(int indx)175cbf5262eSderaadt get_shstr(int indx)
176cbf5262eSderaadt {
177cbf5262eSderaadt 	return &(shstrtab[indx]);
178cbf5262eSderaadt }
179cbf5262eSderaadt 
180cbf5262eSderaadt void
load_symtab(Elf_Ehdr * pehdr,char * pexe)181cbf5262eSderaadt load_symtab(Elf_Ehdr * pehdr, char *pexe)
182cbf5262eSderaadt {
183cbf5262eSderaadt 	Elf_Sym        *symtab;
184cbf5262eSderaadt 	Elf_Shdr       *symsect;
185cbf5262eSderaadt 	int             symtabsize;
186cbf5262eSderaadt 	Elf_Shdr       *psymshdr;
187cbf5262eSderaadt 	Elf_Shdr       *pshdr;
188cbf5262eSderaadt #ifdef DEBUG
189cbf5262eSderaadt 	char           *shname;
190cbf5262eSderaadt #endif
191cbf5262eSderaadt 	int             i;
192cbf5262eSderaadt 
193cbf5262eSderaadt 	symtab = NULL;
194cbf5262eSderaadt 	for (i = 0; i < pehdr->e_shnum; i++) {
195cbf5262eSderaadt 		pshdr = (Elf_Shdr *) (pexe + pehdr->e_shoff +
196cbf5262eSderaadt 		    (i * pehdr->e_shentsize));
197cbf5262eSderaadt 		if (SHT_REL != pshdr->sh_type && SHT_RELA != pshdr->sh_type)
198cbf5262eSderaadt 			continue;
199cbf5262eSderaadt 		psymshdr = (Elf_Shdr *) (pexe + pehdr->e_shoff +
200cbf5262eSderaadt 		    (pshdr->sh_link * pehdr->e_shentsize));
201cbf5262eSderaadt #ifdef DEBUG
202cbf5262eSderaadt 		fprint_shstr(stdout, pshdr->sh_name);
203cbf5262eSderaadt 		printf("\n");
204cbf5262eSderaadt #endif
205cbf5262eSderaadt 		symtab = (Elf_Sym *) (pexe + psymshdr->sh_offset);
206cbf5262eSderaadt 		symsect = psymshdr;
207cbf5262eSderaadt 		symtabsize = psymshdr->sh_size;
208cbf5262eSderaadt 
209cbf5262eSderaadt #ifdef DEBUG
210cbf5262eSderaadt 		dump_symtab(symsect, symtab, symtabsize);
211cbf5262eSderaadt #endif
212cbf5262eSderaadt 		hide_sym(pehdr, symsect, symtab, symtabsize, pshdr->sh_link);
213cbf5262eSderaadt 	}
214cbf5262eSderaadt 
215cbf5262eSderaadt }
216cbf5262eSderaadt 
217cbf5262eSderaadt void
dump_symtab(Elf_Shdr * symsect,Elf_Sym * symtab,int symtabsize)218cbf5262eSderaadt dump_symtab(Elf_Shdr * symsect, Elf_Sym * symtab, int symtabsize)
219cbf5262eSderaadt {
220cbf5262eSderaadt 	int             i;
221cbf5262eSderaadt 	Elf_Sym        *psymtab;
222cbf5262eSderaadt 
223cbf5262eSderaadt 	for (i = 0; i < (symtabsize / sizeof(Elf_Sym)); i++) {
224cbf5262eSderaadt 		psymtab = &(symtab[i]);
225cbf5262eSderaadt 		if ((psymtab->st_info & 0xf0) == 0x10 &&
226cbf5262eSderaadt 		    (psymtab->st_shndx != SHN_UNDEF)) {
227cbf5262eSderaadt 			printf("symbol %d:\n", i);
228cbf5262eSderaadt 			printf("st_name %x \"%s\"\n", psymtab->st_name,
229cbf5262eSderaadt 			    get_str(psymtab->st_name));
2308c4fa846Sderaadt 			printf("st_value %llx\n", (unsigned long long)psymtab->st_value);
2318c4fa846Sderaadt 			printf("st_size %llx\n", (unsigned long long)psymtab->st_size);
232cbf5262eSderaadt 			printf("st_info %x\n", psymtab->st_info);
233cbf5262eSderaadt 			printf("st_other %x\n", psymtab->st_other);
234cbf5262eSderaadt 			printf("st_shndx %x\n", psymtab->st_shndx);
235cbf5262eSderaadt 		}
236cbf5262eSderaadt 	}
237cbf5262eSderaadt }
238cbf5262eSderaadt 
239cbf5262eSderaadt char           *strtab;
240cbf5262eSderaadt int             strtabsize;
241cbf5262eSderaadt void
load_strtab(Elf_Ehdr * pehdr,char * pexe)242cbf5262eSderaadt load_strtab(Elf_Ehdr * pehdr, char *pexe)
243cbf5262eSderaadt {
244cbf5262eSderaadt 	Elf_Shdr       *pshdr = NULL;
245cbf5262eSderaadt 	char           *shname;
246cbf5262eSderaadt 	int             i;
247cbf5262eSderaadt 	strtab = NULL;
248cbf5262eSderaadt 	for (i = 0; i < pehdr->e_shnum; i++) {
249cbf5262eSderaadt 		pshdr = (Elf_Shdr *) (pexe + pehdr->e_shoff +
250cbf5262eSderaadt 		    (i * pehdr->e_shentsize));
251cbf5262eSderaadt 
252cbf5262eSderaadt 		shname = get_shstr(pshdr->sh_name);
253cbf5262eSderaadt 		if (strcmp(".strtab", shname) == 0)
254cbf5262eSderaadt 			break;
255cbf5262eSderaadt 	}
256cbf5262eSderaadt #ifdef DEBUG
257cbf5262eSderaadt 	fprint_shstr(stdout, pshdr->sh_name);
258cbf5262eSderaadt 	printf("\n");
259cbf5262eSderaadt #endif
260cbf5262eSderaadt 
261cbf5262eSderaadt 	strtab = (char *) (pexe + pshdr->sh_offset);
262cbf5262eSderaadt 
263cbf5262eSderaadt 	strtabsize = pshdr->sh_size;
264cbf5262eSderaadt 
265cbf5262eSderaadt #ifdef DEBUG
266cbf5262eSderaadt 	dump_strtab();
267cbf5262eSderaadt #endif
268cbf5262eSderaadt }
269cbf5262eSderaadt 
270cbf5262eSderaadt void
dump_strtab()271cbf5262eSderaadt dump_strtab()
272cbf5262eSderaadt {
273cbf5262eSderaadt 	int             index;
274cbf5262eSderaadt 	char           *pstr;
275cbf5262eSderaadt 	char           *pnstr;
276cbf5262eSderaadt 	int             i = 0;
277cbf5262eSderaadt 	index = 0;
278cbf5262eSderaadt 	pstr = strtab;
279cbf5262eSderaadt 	while (index < strtabsize) {
280cbf5262eSderaadt 		printf("string %x: \"%s\"\n", i, pstr);
281cbf5262eSderaadt 		pnstr = pstr + strlen(pstr) + 1;
282cbf5262eSderaadt 		index = pnstr - strtab;
283cbf5262eSderaadt 		pstr = pnstr;
284cbf5262eSderaadt 		i++;
285cbf5262eSderaadt 	}
286cbf5262eSderaadt 
287cbf5262eSderaadt }
288cbf5262eSderaadt 
289cbf5262eSderaadt void
fprint_str(FILE * channel,int indx)290cbf5262eSderaadt fprint_str(FILE * channel, int indx)
291cbf5262eSderaadt {
292cbf5262eSderaadt 	if (strtab != NULL)
293cbf5262eSderaadt 		fprintf(channel, "\"%s\"", &(strtab[indx]));
294cbf5262eSderaadt }
295cbf5262eSderaadt 
296cbf5262eSderaadt char *
get_str(int indx)297cbf5262eSderaadt get_str(int indx)
298cbf5262eSderaadt {
299cbf5262eSderaadt 	return &(strtab[indx]);
300cbf5262eSderaadt }
301cbf5262eSderaadt 
302cbf5262eSderaadt int             in_keep_list(char *symbol);
303cbf5262eSderaadt 
304cbf5262eSderaadt void
hide_sym(Elf_Ehdr * ehdr,Elf_Shdr * symsect,Elf_Sym * symtab,int symtabsize,int symtabsecnum)305cbf5262eSderaadt hide_sym(Elf_Ehdr * ehdr, Elf_Shdr * symsect,
306cbf5262eSderaadt     Elf_Sym * symtab, int symtabsize, int symtabsecnum)
307cbf5262eSderaadt {
308cbf5262eSderaadt 	int             i;
309cbf5262eSderaadt 	unsigned char   info;
310cbf5262eSderaadt 	Elf_Sym        *psymtab;
311cbf5262eSderaadt 
312cbf5262eSderaadt 	for (i = 0; i < (symtabsize / sizeof(Elf_Sym)); i++) {
313cbf5262eSderaadt 		psymtab = &(symtab[i]);
314cbf5262eSderaadt 		if ((psymtab->st_info & 0xf0) == 0x10 &&
315cbf5262eSderaadt 		    (psymtab->st_shndx != SHN_UNDEF)) {
316cbf5262eSderaadt 			if (in_keep_list(get_str(psymtab->st_name)))
317cbf5262eSderaadt 				continue;
318cbf5262eSderaadt #ifdef DEBUG
319cbf5262eSderaadt 			printf("symbol %d:\n", i);
320cbf5262eSderaadt 			printf("st_name %x \"%s\"\n", psymtab->st_name,
321cbf5262eSderaadt 			    get_str(psymtab->st_name));
322cbf5262eSderaadt 			printf("st_info %x\n", psymtab->st_info);
323cbf5262eSderaadt #endif
32403ab18c2Sdrahn 			if (!elf_mangle) {
325cbf5262eSderaadt 				info = psymtab->st_info;
326cbf5262eSderaadt 				info = info & 0xf;
327cbf5262eSderaadt 				psymtab->st_info = info;
32803ab18c2Sdrahn 			} else {
329516251d4Sdrahn 				mangle_str(get_str(psymtab->st_name));
330cbf5262eSderaadt 			}
331cbf5262eSderaadt #ifdef DEBUG
332cbf5262eSderaadt 			printf("st_info %x\n", psymtab->st_info);
333cbf5262eSderaadt #endif
334cbf5262eSderaadt 		}
335cbf5262eSderaadt 	}
336cbf5262eSderaadt 	reorder_syms(ehdr, symsect, symtab, symtabsize, symtabsecnum);
337cbf5262eSderaadt }
338cbf5262eSderaadt 
339cbf5262eSderaadt void
reorder_syms(Elf_Ehdr * ehdr,Elf_Shdr * symsect,Elf_Sym * symtab,int symtabsize,int symtabsecnum)340cbf5262eSderaadt reorder_syms(Elf_Ehdr * ehdr, Elf_Shdr * symsect,
341cbf5262eSderaadt     Elf_Sym * symtab, int symtabsize, int symtabsecnum)
342cbf5262eSderaadt {
343cbf5262eSderaadt 	int             i;
344cbf5262eSderaadt 	int             nsyms;
345cbf5262eSderaadt 	int             cursym;
346cbf5262eSderaadt 	Elf_Sym        *tmpsymtab;
347cbf5262eSderaadt 	Symmap         *symmap;
348cbf5262eSderaadt 
349cbf5262eSderaadt 
350cbf5262eSderaadt 	nsyms = symtabsize / sizeof(Elf_Sym);
351cbf5262eSderaadt 
35235de856eSderaadt 	tmpsymtab = calloc(1, symtabsize);
35335de856eSderaadt 	symmap = calloc(nsyms, sizeof(Symmap));
354cbf5262eSderaadt 	if (!tmpsymtab || !symmap)
3555ad04d35Sguenther 		errc(5, ENOMEM, "calloc");
356cbf5262eSderaadt 
357cbf5262eSderaadt 	bcopy(symtab, tmpsymtab, symtabsize);
358cbf5262eSderaadt 
359cbf5262eSderaadt 	cursym = 1;
360cbf5262eSderaadt 	for (i = 1; i < nsyms; i++) {
361cbf5262eSderaadt 		if ((tmpsymtab[i].st_info & 0xf0) == 0x00) {
362cbf5262eSderaadt #ifdef DEBUG
363cbf5262eSderaadt 			printf("copying  l o%d n%d <%s>\n", i, cursym,
364cbf5262eSderaadt 			    get_str(tmpsymtab[i].st_name));
365cbf5262eSderaadt #endif
366cbf5262eSderaadt 			bcopy(&(tmpsymtab[i]), &(symtab[cursym]),
367cbf5262eSderaadt 			    sizeof(Elf_Sym));
368cbf5262eSderaadt 			symmap[i] = cursym;
369cbf5262eSderaadt 			cursym++;
370cbf5262eSderaadt 		}
371cbf5262eSderaadt 	}
372cbf5262eSderaadt 	symsect->sh_info = cursym;
373cbf5262eSderaadt 	for (i = 1; i < nsyms; i++) {
374cbf5262eSderaadt 		if ((tmpsymtab[i].st_info & 0xf0) != 0x00) {
375cbf5262eSderaadt #ifdef DEBUG
376cbf5262eSderaadt 			printf("copying nl o%d n%d <%s>\n", i, cursym,
377cbf5262eSderaadt 			    get_str(tmpsymtab[i].st_name));
378cbf5262eSderaadt #endif
379cbf5262eSderaadt 			bcopy(&(tmpsymtab[i]), &(symtab[cursym]),
380cbf5262eSderaadt 			    sizeof(Elf_Sym));
381cbf5262eSderaadt 			symmap[i] = cursym;
382cbf5262eSderaadt 			cursym++;
383cbf5262eSderaadt 		}
384cbf5262eSderaadt 	}
385cbf5262eSderaadt 	if (cursym != nsyms) {
386cbf5262eSderaadt 		printf("miscounted symbols somewhere c %d n %d \n",
387cbf5262eSderaadt 		    cursym, nsyms);
388cbf5262eSderaadt 		exit(5);
389cbf5262eSderaadt 	}
390cbf5262eSderaadt 	renum_reloc_syms(ehdr, symmap, symtabsecnum);
391cbf5262eSderaadt 	free(tmpsymtab);
392cbf5262eSderaadt 	free(symmap);
393cbf5262eSderaadt }
394cbf5262eSderaadt 
395cbf5262eSderaadt void
renum_reloc_syms(Elf_Ehdr * ehdr,Symmap * symmap,int symtabsecnum)396cbf5262eSderaadt renum_reloc_syms(Elf_Ehdr * ehdr, Symmap * symmap, int symtabsecnum)
397cbf5262eSderaadt {
398cbf5262eSderaadt 	Elf_Shdr       *pshdr;
399cbf5262eSderaadt 	int             i, j;
400cbf5262eSderaadt 	int             num_reloc;
401cbf5262eSderaadt 	Elf_Rel        *prel;
402cbf5262eSderaadt 	Elf_RelA       *prela;
403cbf5262eSderaadt 	int             symnum;
404cbf5262eSderaadt 
405cbf5262eSderaadt 	for (i = 0; i < ehdr->e_shnum; i++) {
406cbf5262eSderaadt 		pshdr = (Elf_Shdr *) (pexe + ehdr->e_shoff +
407cbf5262eSderaadt 		    (i * ehdr->e_shentsize));
408cbf5262eSderaadt 		if ((pshdr->sh_type == SHT_RELA) &&
409cbf5262eSderaadt 		    pshdr->sh_link == symtabsecnum) {
410cbf5262eSderaadt 
411cbf5262eSderaadt #ifdef DEBUG
412cbf5262eSderaadt 			printf("section %d has rela relocations in symtab\n", i);
413cbf5262eSderaadt #endif
414cbf5262eSderaadt 			prela = (Elf_RelA *) (pexe + pshdr->sh_offset);
415cbf5262eSderaadt 			num_reloc = pshdr->sh_size / sizeof(Elf_RelA);
416cbf5262eSderaadt 			for (j = 0; j < num_reloc; j++) {
417cbf5262eSderaadt 				symnum = ELF_R_SYM(prela[j].r_info);
418cbf5262eSderaadt #ifdef DEBUG
419cbf5262eSderaadt 				printf("sym num o %d n %d\n", symnum,
420cbf5262eSderaadt 				    symmap[symnum]);
421cbf5262eSderaadt #endif
422cbf5262eSderaadt 				prela[j].r_info = ELF_R_INFO(symmap[symnum],
423cbf5262eSderaadt 				    ELF_R_TYPE(prela[j].r_info));
424cbf5262eSderaadt 			}
425cbf5262eSderaadt 		}
426cbf5262eSderaadt 		if ((pshdr->sh_type == SHT_REL) &&
427cbf5262eSderaadt 		    pshdr->sh_link == symtabsecnum) {
428cbf5262eSderaadt #ifdef DEBUG
429cbf5262eSderaadt 			printf("section %d has rel relocations in symtab\n", i);
430cbf5262eSderaadt #endif
431cbf5262eSderaadt 			prel = (Elf_Rel *) (pexe + pshdr->sh_offset);
432cbf5262eSderaadt 			num_reloc = pshdr->sh_size / sizeof(Elf_Rel);
433cbf5262eSderaadt 			for (j = 0; j < num_reloc; j++) {
434cbf5262eSderaadt 				symnum = ELF_R_SYM(prel[j].r_info);
435cbf5262eSderaadt #ifdef DEBUG
436cbf5262eSderaadt 				printf("sym num o %d n %d\n", symnum,
437cbf5262eSderaadt 				    symmap[symnum]);
438cbf5262eSderaadt #endif
439cbf5262eSderaadt 				prel[j].r_info = ELF_R_INFO(symmap[symnum],
440cbf5262eSderaadt 				    ELF_R_TYPE(prel[j].r_info));
441cbf5262eSderaadt 			}
442cbf5262eSderaadt 		}
443cbf5262eSderaadt 	}
444cbf5262eSderaadt 
445cbf5262eSderaadt }
446