map_object.c (225699) | map_object.c (230784) |
---|---|
1/*- 2 * Copyright 1996-1998 John D. Polstra. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 8 unchanged lines hidden (view full) --- 17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * | 1/*- 2 * Copyright 1996-1998 John D. Polstra. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 8 unchanged lines hidden (view full) --- 17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * |
25 * $FreeBSD: head/libexec/rtld-elf/map_object.c 225699 2011-09-20 21:49:54Z kib $ | 25 * $FreeBSD: head/libexec/rtld-elf/map_object.c 230784 2012-01-30 19:52:17Z kib $ |
26 */ 27 28#include <sys/param.h> 29#include <sys/mman.h> 30#include <sys/stat.h> 31 32#include <errno.h> 33#include <stddef.h> --- 45 unchanged lines hidden (view full) --- 79 caddr_t clear_addr; 80 caddr_t clear_page; 81 Elf_Addr phdr_vaddr; 82 size_t nclear, phsize; 83 Elf_Addr bss_vaddr; 84 Elf_Addr bss_vlimit; 85 caddr_t bss_addr; 86 Elf_Word stack_flags; | 26 */ 27 28#include <sys/param.h> 29#include <sys/mman.h> 30#include <sys/stat.h> 31 32#include <errno.h> 33#include <stddef.h> --- 45 unchanged lines hidden (view full) --- 79 caddr_t clear_addr; 80 caddr_t clear_page; 81 Elf_Addr phdr_vaddr; 82 size_t nclear, phsize; 83 Elf_Addr bss_vaddr; 84 Elf_Addr bss_vlimit; 85 caddr_t bss_addr; 86 Elf_Word stack_flags; |
87 Elf_Addr relro_page; 88 size_t relro_size; |
|
87 88 hdr = get_elf_header(fd, path); 89 if (hdr == NULL) 90 return (NULL); 91 92 /* 93 * Scan the program header entries, and save key information. 94 * 95 * We expect that the loadable segments are ordered by load address. 96 */ 97 phdr = (Elf_Phdr *) ((char *)hdr + hdr->e_phoff); 98 phsize = hdr->e_phnum * sizeof (phdr[0]); 99 phlimit = phdr + hdr->e_phnum; 100 nsegs = -1; 101 phdyn = phinterp = phtls = NULL; 102 phdr_vaddr = 0; | 89 90 hdr = get_elf_header(fd, path); 91 if (hdr == NULL) 92 return (NULL); 93 94 /* 95 * Scan the program header entries, and save key information. 96 * 97 * We expect that the loadable segments are ordered by load address. 98 */ 99 phdr = (Elf_Phdr *) ((char *)hdr + hdr->e_phoff); 100 phsize = hdr->e_phnum * sizeof (phdr[0]); 101 phlimit = phdr + hdr->e_phnum; 102 nsegs = -1; 103 phdyn = phinterp = phtls = NULL; 104 phdr_vaddr = 0; |
105 relro_page = 0; 106 relro_size = 0; |
|
103 segs = alloca(sizeof(segs[0]) * hdr->e_phnum); 104 stack_flags = RTLD_DEFAULT_STACK_PF_EXEC | PF_R | PF_W; 105 while (phdr < phlimit) { 106 switch (phdr->p_type) { 107 108 case PT_INTERP: 109 phinterp = phdr; 110 break; --- 18 unchanged lines hidden (view full) --- 129 130 case PT_TLS: 131 phtls = phdr; 132 break; 133 134 case PT_GNU_STACK: 135 stack_flags = phdr->p_flags; 136 break; | 107 segs = alloca(sizeof(segs[0]) * hdr->e_phnum); 108 stack_flags = RTLD_DEFAULT_STACK_PF_EXEC | PF_R | PF_W; 109 while (phdr < phlimit) { 110 switch (phdr->p_type) { 111 112 case PT_INTERP: 113 phinterp = phdr; 114 break; --- 18 unchanged lines hidden (view full) --- 133 134 case PT_TLS: 135 phtls = phdr; 136 break; 137 138 case PT_GNU_STACK: 139 stack_flags = phdr->p_flags; 140 break; |
141 142 case PT_GNU_RELRO: 143 relro_page = phdr->p_vaddr; 144 relro_size = phdr->p_memsz; 145 break; |
|
137 } 138 139 ++phdr; 140 } 141 if (phdyn == NULL) { 142 _rtld_error("%s: object is not dynamically-linked", path); 143 return NULL; 144 } --- 119 unchanged lines hidden (view full) --- 264 tls_dtv_generation++; 265 obj->tlsindex = ++tls_max_index; 266 obj->tlssize = phtls->p_memsz; 267 obj->tlsalign = phtls->p_align; 268 obj->tlsinitsize = phtls->p_filesz; 269 obj->tlsinit = mapbase + phtls->p_vaddr; 270 } 271 obj->stack_flags = stack_flags; | 146 } 147 148 ++phdr; 149 } 150 if (phdyn == NULL) { 151 _rtld_error("%s: object is not dynamically-linked", path); 152 return NULL; 153 } --- 119 unchanged lines hidden (view full) --- 273 tls_dtv_generation++; 274 obj->tlsindex = ++tls_max_index; 275 obj->tlssize = phtls->p_memsz; 276 obj->tlsalign = phtls->p_align; 277 obj->tlsinitsize = phtls->p_filesz; 278 obj->tlsinit = mapbase + phtls->p_vaddr; 279 } 280 obj->stack_flags = stack_flags; |
281 obj->relro_page = obj->relocbase + trunc_page(relro_page); 282 obj->relro_size = round_page(relro_size); 283 |
|
272 return obj; 273} 274 275static Elf_Ehdr * 276get_elf_header (int fd, const char *path) 277{ 278 static union { 279 Elf_Ehdr hdr; --- 135 unchanged lines hidden --- | 284 return obj; 285} 286 287static Elf_Ehdr * 288get_elf_header (int fd, const char *path) 289{ 290 static union { 291 Elf_Ehdr hdr; --- 135 unchanged lines hidden --- |