1 /* $NetBSD: exec_elf32.c,v 1.8 2000/06/14 17:26:15 cgd Exp $ */ 2 3 /* 4 * Copyright (c) 1996 Christopher G. Demetriou 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed for the 18 * NetBSD Project. See http://www.netbsd.org/ for 19 * information about NetBSD. 20 * 4. The name of the author may not be used to endorse or promote products 21 * derived from this software without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 * 34 * <<Id: LICENSE,v 1.2 2000/06/14 15:57:33 cgd Exp>> 35 */ 36 37 #include <sys/cdefs.h> 38 #ifndef lint 39 __RCSID("$NetBSD: exec_elf32.c,v 1.8 2000/06/14 17:26:15 cgd Exp $"); 40 #endif /* not lint */ 41 42 #ifndef ELFSIZE 43 #define ELFSIZE 32 44 #endif 45 46 #include <sys/types.h> 47 #include <stdio.h> 48 #include <string.h> 49 #include "extern.h" 50 51 #if defined(NLIST_ELF32) || defined(NLIST_ELF64) 52 #include <sys/exec_elf.h> 53 #endif 54 55 #if (defined(NLIST_ELF32) && (ELFSIZE == 32)) || \ 56 (defined(NLIST_ELF64) && (ELFSIZE == 64)) 57 58 #define check(off, size) ((off < 0) || (off + size > mappedsize)) 59 #define BAD do { rv = -1; goto out; } while (0) 60 61 int 62 ELFNAMEEND(check)(mappedfile, mappedsize) 63 const char *mappedfile; 64 size_t mappedsize; 65 { 66 Elf_Ehdr *ehdrp; 67 int rv; 68 69 rv = 0; 70 71 if (check(0, sizeof *ehdrp)) 72 BAD; 73 ehdrp = (Elf_Ehdr *)&mappedfile[0]; 74 75 if (memcmp(ehdrp->e_ident, ELFMAG, SELFMAG) != 0 || 76 ehdrp->e_ident[EI_CLASS] != ELFCLASS) 77 BAD; 78 79 switch (ehdrp->e_machine) { 80 ELFDEFNNAME(MACHDEP_ID_CASES) 81 82 default: 83 BAD; 84 } 85 86 out: 87 return (rv); 88 } 89 90 int 91 ELFNAMEEND(findoff)(mappedfile, mappedsize, vmaddr, fileoffp) 92 const char *mappedfile; 93 size_t mappedsize, *fileoffp; 94 u_long vmaddr; 95 { 96 Elf_Ehdr *ehdrp; 97 Elf_Shdr *shdrp; 98 Elf_Off shdr_off; 99 Elf_Word shdr_size; 100 #if (ELFSIZE == 32) 101 Elf32_Half nshdr, i; 102 #elif (ELFSIZE == 64) 103 Elf64_Half nshdr, i; 104 #endif 105 int rv; 106 107 rv = 0; 108 109 ehdrp = (Elf_Ehdr *)&mappedfile[0]; 110 nshdr = ehdrp->e_shnum; 111 shdr_off = ehdrp->e_shoff; 112 shdr_size = ehdrp->e_shentsize * nshdr; 113 114 if (check(shdr_off, shdr_size) || 115 (sizeof *shdrp != ehdrp->e_shentsize)) 116 BAD; 117 shdrp = (Elf_Shdr *)&mappedfile[shdr_off]; 118 119 for (i = 0; i < nshdr; i++) { 120 if (shdrp[i].sh_addr <= vmaddr && 121 vmaddr < (shdrp[i].sh_addr + shdrp[i].sh_size)) { 122 *fileoffp = vmaddr - 123 shdrp[i].sh_addr + shdrp[i].sh_offset; 124 break; 125 } 126 } 127 if (i == nshdr) 128 BAD; 129 130 out: 131 return (rv); 132 } 133 134 #endif /* include this size of ELF */ 135