Deleted Added
full compact
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 ---