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