diff options
author | Mark Kettenis <kettenis@cvs.openbsd.org> | 2015-09-09 09:41:43 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@cvs.openbsd.org> | 2015-09-09 09:41:43 +0000 |
commit | abfd040df23996e22732406201f416b5a77c2855 (patch) | |
tree | c1adda8f19bc5f2c7b3fec7d15eb97eb6e171ef1 /lib/csu/powerpc | |
parent | 2a1748ca4933cc50a719a089c87d84534980dab9 (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.h | 76 |
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" \ ) |