1 /* $NetBSD: exec_elf32.c,v 1.10 2009/07/30 15:16:38 tsutsui Exp $ */
4 * Copyright (c) 1996 Christopher G. Demetriou
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 * <<Id: LICENSE_GC,v 1.1 2001/10/01 23:24:05 cgd Exp>>
32 #include <sys/cdefs.h>
34 __RCSID("$NetBSD: exec_elf32.c,v 1.10 2009/07/30 15:16:38 tsutsui Exp $");
41 #include <sys/types.h>
46 #if defined(NLIST_ELF32) || defined(NLIST_ELF64)
47 #include <sys/exec_elf.h>
50 #if (defined(NLIST_ELF32) && (ELFSIZE == 32)) || \
51 (defined(NLIST_ELF64) && (ELFSIZE == 64))
53 #define check(off, size) ((off < 0) || (off + size > mappedsize))
54 #define BAD do { rv = -1; goto out; } while (0)
57 ELFNAMEEND(check
)(mappedfile
, mappedsize
)
58 const char *mappedfile
;
61 const Elf_Ehdr
*ehdrp
;
66 if (check(0, sizeof *ehdrp
))
68 ehdrp
= (const Elf_Ehdr
*)&mappedfile
[0];
70 if (memcmp(ehdrp
->e_ident
, ELFMAG
, SELFMAG
) != 0 ||
71 ehdrp
->e_ident
[EI_CLASS
] != ELFCLASS
)
74 switch (ehdrp
->e_machine
) {
75 ELFDEFNNAME(MACHDEP_ID_CASES
)
86 ELFNAMEEND(findoff
)(mappedfile
, mappedsize
, vmaddr
, fileoffp
)
87 const char *mappedfile
;
88 size_t mappedsize
, *fileoffp
;
91 const Elf_Ehdr
*ehdrp
;
92 const Elf_Phdr
*phdrp
;
104 ehdrp
= (const Elf_Ehdr
*)&mappedfile
[0];
105 nphdr
= ehdrp
->e_phnum
;
106 phdr_off
= ehdrp
->e_phoff
;
107 phdr_size
= sizeof(Elf_Phdr
) * nphdr
;
109 if (check(0, phdr_off
+ phdr_size
))
111 phdrp
= (const Elf_Phdr
*)&mappedfile
[phdr_off
];
113 #define IS_TEXT(p) (p.p_flags & PF_X)
114 #define IS_DATA(p) (p.p_flags & PF_W)
116 for (i
= 0; i
< nphdr
; i
++) {
117 if ((IS_TEXT(phdrp
[i
]) || IS_DATA(phdrp
[i
])) &&
118 phdrp
[i
].p_vaddr
<= vmaddr
&&
119 vmaddr
< phdrp
[i
].p_vaddr
+ phdrp
[i
].p_filesz
) {
121 phdrp
[i
].p_vaddr
+ phdrp
[i
].p_offset
;
132 #endif /* include this size of ELF */