Module Name: src Committed By: chs Date: Sat Feb 18 01:29:09 UTC 2017
Modified Files: src/sys/kern: exec_elf.c kern_pax.c Log Message: obey the executable's ELF alignment constraints for PIE. this fixes gdb of PIE binaries on mac68k (and other platforms which use an ELF alignment that is larger than PAGE_SIZE). To generate a diff of this commit: cvs rdiff -u -r1.88 -r1.89 src/sys/kern/exec_elf.c cvs rdiff -u -r1.57 -r1.58 src/sys/kern/kern_pax.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/exec_elf.c diff -u src/sys/kern/exec_elf.c:1.88 src/sys/kern/exec_elf.c:1.89 --- src/sys/kern/exec_elf.c:1.88 Sun Feb 12 21:52:46 2017 +++ src/sys/kern/exec_elf.c Sat Feb 18 01:29:09 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: exec_elf.c,v 1.88 2017/02/12 21:52:46 uwe Exp $ */ +/* $NetBSD: exec_elf.c,v 1.89 2017/02/18 01:29:09 chs Exp $ */ /*- * Copyright (c) 1994, 2000, 2005, 2015 The NetBSD Foundation, Inc. @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: exec_elf.c,v 1.88 2017/02/12 21:52:46 uwe Exp $"); +__KERNEL_RCSID(1, "$NetBSD: exec_elf.c,v 1.89 2017/02/18 01:29:09 chs Exp $"); #ifdef _KERNEL_OPT #include "opt_pax.h" @@ -134,7 +134,9 @@ elf_placedynexec(struct exec_package *ep align = ph[i].p_align; offset = (Elf_Addr)pax_aslr_exec_offset(epp, align); - offset += epp->ep_vm_minaddr; + if (offset < epp->ep_vm_minaddr) + offset = roundup(epp->ep_vm_minaddr, align); + KASSERT((offset & (align - 1)) == 0); for (i = 0; i < eh->e_phnum; i++) ph[i].p_vaddr += offset; Index: src/sys/kern/kern_pax.c diff -u src/sys/kern/kern_pax.c:1.57 src/sys/kern/kern_pax.c:1.58 --- src/sys/kern/kern_pax.c:1.57 Sat Sep 17 02:29:11 2016 +++ src/sys/kern/kern_pax.c Sat Feb 18 01:29:09 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_pax.c,v 1.57 2016/09/17 02:29:11 christos Exp $ */ +/* $NetBSD: kern_pax.c,v 1.58 2017/02/18 01:29:09 chs Exp $ */ /* * Copyright (c) 2015 The NetBSD Foundation, Inc. @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_pax.c,v 1.57 2016/09/17 02:29:11 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_pax.c,v 1.58 2017/02/18 01:29:09 chs Exp $"); #include "opt_pax.h" @@ -578,7 +578,7 @@ pax_aslr_offset(vaddr_t align) uint32_t rand; vaddr_t offset; - pax_align = align == 0 ? PGSHIFT : align; + pax_align = align == 0 ? PAGE_SIZE : align; l2 = ilog2(pax_align); rand = cprng_fast32(); @@ -590,7 +590,8 @@ pax_aslr_offset(vaddr_t align) #define PAX_TRUNC(a, b) ((a) & ~((b) - 1)) delta = PAX_ASLR_DELTA(rand, l2, PAX_ASLR_DELTA_EXEC_LEN); - offset = PAX_TRUNC(delta, pax_align) + PAGE_SIZE; + offset = PAX_TRUNC(delta, pax_align); + offset = MAX(offset, pax_align); PAX_DPRINTF("rand=%#x l2=%#zx pax_align=%#zx delta=%#zx offset=%#jx", rand, l2, pax_align, delta, (uintmax_t)offset); @@ -608,9 +609,9 @@ pax_aslr_exec_offset(struct exec_package if (pax_aslr_flags & PAX_ASLR_EXEC_OFFSET) goto out; #endif - return pax_aslr_offset(align) + PAGE_SIZE; + return pax_aslr_offset(align); out: - return MAX(align, PAGE_SIZE); + return 0; } voff_t