summaryrefslogtreecommitdiff
path: root/lib/csu/powerpc
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@cvs.openbsd.org>2015-09-09 09:41:43 +0000
committerMark Kettenis <kettenis@cvs.openbsd.org>2015-09-09 09:41:43 +0000
commitabfd040df23996e22732406201f416b5a77c2855 (patch)
treec1adda8f19bc5f2c7b3fec7d15eb97eb6e171ef1 /lib/csu/powerpc
parent2a1748ca4933cc50a719a089c87d84534980dab9 (diff)
Now that ld(1) will generate a read-only GOT for truly static binaries, we
no longer have to use mprotect(2) to take away PROT_WRITE. This fixes ld -Z and paves the way for the new Secure-PLT ABI. ok miod@
Diffstat (limited to 'lib/csu/powerpc')
-rw-r--r--lib/csu/powerpc/md_init.h76
1 files changed, 4 insertions, 72 deletions
diff --git a/lib/csu/powerpc/md_init.h b/lib/csu/powerpc/md_init.h
index 1a6cadec427..4a707215540 100644
--- a/lib/csu/powerpc/md_init.h
+++ b/lib/csu/powerpc/md_init.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: md_init.h,v 1.4 2015/09/01 05:40:06 guenther Exp $ */
+/* $OpenBSD: md_init.h,v 1.5 2015/09/09 09:41:42 kettenis Exp $ */
/*-
* Copyright (c) 2001 Ross Harvey
@@ -64,88 +64,20 @@
#include <sys/syscall.h> /* for SYS_mprotect */
#define STR(x) __STRING(x)
+
#define MD_CRT0_START \
__asm( \
" .text \n" \
" .section \".text\" \n" \
" .align 2 \n" \
-" .size __got_start, 0 \n" \
-" .type __got_start, @object \n" \
-" .size __got_end, 0 \n" \
-" .type __got_end, @object \n" \
-" .weak __got_start \n" \
-" .weak __got_end \n" \
" .globl _start \n" \
" .type _start, @function \n" \
" .globl __start \n" \
" .type __start, @function \n" \
"_start: \n" \
"__start: \n" \
-" # move argument registers to saved registers for startup flush \n" \
-" # ...except r6 (auxv) as ___start() doesn't need it \n" \
-" mr %r25, %r3 \n" \
-" mr %r24, %r4 \n" \
-" mr %r23, %r5 \n" \
-" mr %r22, %r7 \n" \
-" mflr %r27 /* save off old link register */ \n" \
-" bl 1f \n" \
-" # this instruction never gets executed but can be used \n" \
-" # to find the virtual address where the page is loaded. \n" \
-" bl _GLOBAL_OFFSET_TABLE_@local-4 \n" \
-"1: \n" \
-" mflr %r6 # this stores where we are (+4) \n" \
-" lwz %r18, 0(%r6) # load the instruction at offset_sym \n" \
-" # it contains an offset to the location \n" \
-" # of the GOT. \n" \
-" \n" \
-" rlwinm %r18,%r18,0,8,30 # mask off the offset portion of the instr. \n" \
-" \n" \
-" /* \n" \
-" * these adds effectively calculate the value the \n" \
-" * bl _GLOBAL_OFFSET_TABLE_@local-4 \n" \
-" * operation that would be below would calculate. \n" \
-" */ \n" \
-" add %r28, %r18, %r6 \n" \
-" \n" \
-" addi %r3,%r28,4 # calculate the actual got addr \n" \
-" lwz %r0,__got_start@got(%r3) \n" \
-" cmpwi %r0,0 \n" \
-" beq 4f \n" \
-" cmpw %r0,%r28 \n" \
-" bne 4f \n" \
-" lwz %r4,__got_end@got(%r3) \n" \
-" cmpwi %r4,0 \n" \
-" beq 2f \n" \
-" \n" \
-" sub %r4, %r4, %r0 \n" \
-" b 3f \n" \
-"2: \n" \
-" li %r4, 4 \n" \
-"3: \n" \
-" \n" \
-" /* mprotect GOT to eliminate W+X regions in static binaries */ \n" \
-" li %r0, " STR(SYS_mprotect) " \n" \
-" mr %r3, %r28 \n" \
-" li %r5, 5 /* (PROT_READ|PROT_EXEC) */ \n" \
-" sc \n" \
-" \n" \
-"4: \n" \
-" li %r0, 0 \n" \
-" # flush the blrl instruction out of the data cache \n" \
-" dcbf %r6, %r18 \n" \
-" sync \n" \
-" isync \n" \
-" # make certain that the got table addr is not in the icache \n" \
-" icbi %r6, %r18 \n" \
-" sync \n" \
-" isync \n" \
-" mtlr %r27 \n" \
-" # move argument registers back from saved registers \n" \
-" # putting cleanup in r6 instead of r7 \n" \
-" mr %r3, %r25 \n" \
-" mr %r4, %r24 \n" \
-" mr %r5, %r23 \n" \
-" mr %r6, %r22 \n" \
+" # put cleanup in r6 instead of r7 \n" \
+" mr %r6, %r7 \n" \
" b ___start \n" \
)