diff options
author | Philip Guenther <guenther@cvs.openbsd.org> | 2018-11-22 21:37:31 +0000 |
---|---|---|
committer | Philip Guenther <guenther@cvs.openbsd.org> | 2018-11-22 21:37:31 +0000 |
commit | 471845a341fceabc401fe7f6d2ca619b1116dc17 (patch) | |
tree | f232d6064154369df1d6cde9c59ba4110618e59d | |
parent | ccb3815c70643d0344d2398bd4d610cf33cb4b4d (diff) |
Make alpha less special: _dl_boot_bind() is written to complete
relocation of ld.so's GOT without using it, so _reloc_alpha_got()
merely made the call to _dl_boot_bind() from asm simpler...while
itself being a call that required special handling.
diff and muild baking by miod@
ok guenther@
-rw-r--r-- | lib/csu/alpha/md_init.h | 14 | ||||
-rw-r--r-- | lib/csu/boot.h | 34 | ||||
-rw-r--r-- | libexec/ld.so/alpha/archdep.h | 4 | ||||
-rw-r--r-- | libexec/ld.so/alpha/ldasm.S | 20 | ||||
-rw-r--r-- | libexec/ld.so/alpha/rtld_machine.c | 36 |
5 files changed, 22 insertions, 86 deletions
diff --git a/lib/csu/alpha/md_init.h b/lib/csu/alpha/md_init.h index 27b5c133547..715261459cb 100644 --- a/lib/csu/alpha/md_init.h +++ b/lib/csu/alpha/md_init.h @@ -1,4 +1,4 @@ -/* $OpenBSD: md_init.h,v 1.9 2017/08/11 20:13:30 guenther Exp $ */ +/* $OpenBSD: md_init.h,v 1.10 2018/11/22 21:37:29 guenther Exp $ */ /*- * Copyright (c) 2001 Ross Harvey * All rights reserved. @@ -81,19 +81,17 @@ " mov $16, $9 \n" \ " br $11, L2 \n" \ "L2: ldiq $12, L2 \n" \ - " subq $11, $12, $11 \n" \ - " mov $11, $17 \n" \ + " subq $11, $12, $10 \n" \ " lda $6, _DYNAMIC \n" \ - " addq $11, $6, $16 \n" \ - " mov $16, $15 \n" \ - " bsr $26, _reloc_alpha_got \n" \ + " addq $10, $6, $15 \n" \ " lda $sp, -80($sp) \n" \ " mov $9, $16 \n" \ " lda $11, 0($sp) \n" \ " mov $11, $17 \n" \ " mov $15, $18 \n" \ - " jsr $26, _dl_boot_bind \n" \ - " ldgp $gp, 0($26) \n" \ + " lda $27, _dl_boot_bind \n" \ + " addq $10, $27, $27 \n" \ + " bsr $26, _dl_boot_bind \n" \ " mov $9, $16 \n" \ " mov 0, $17 \n" \ " jsr $26, ___start \n" \ diff --git a/lib/csu/boot.h b/lib/csu/boot.h index 1171a46140e..c899af9303b 100644 --- a/lib/csu/boot.h +++ b/lib/csu/boot.h @@ -1,4 +1,4 @@ -/* $OpenBSD: boot.h,v 1.28 2017/01/29 22:31:09 chl Exp $ */ +/* $OpenBSD: boot.h,v 1.29 2018/11/22 21:37:29 guenther Exp $ */ /* * Copyright (c) 1998 Per Fogelstrom, Opsycon AB @@ -231,36 +231,4 @@ _dl_boot_bind(const long sp, long *dl_data, Elf_Dyn *dynamicp) } } -#ifdef __alpha__ - -void _reloc_alpha_got(Elf_Dyn *dynp, Elf_Addr relocbase); - -void -_reloc_alpha_got(Elf_Dyn *dynp, Elf_Addr relocbase) -{ - const Elf_RelA *rela = 0, *relalim; - Elf_Addr relasz = 0; - Elf_Addr *where; - - for (; dynp->d_tag != DT_NULL; dynp++) { - switch (dynp->d_tag) { - case DT_RELA: - rela = (const Elf_RelA *)(relocbase + dynp->d_un.d_ptr); - break; - case DT_RELASZ: - relasz = dynp->d_un.d_val; - break; - } - } - relalim = (const Elf_RelA *)((caddr_t)rela + relasz); - for (; rela < relalim; rela++) { - if (ELF64_R_TYPE(rela->r_info) != RELOC_RELATIVE) - continue; - where = (Elf_Addr *)(relocbase + rela->r_offset); - *where += (Elf_Addr)relocbase; - } -} - -#endif - #endif /* RCRT0 */ diff --git a/libexec/ld.so/alpha/archdep.h b/libexec/ld.so/alpha/archdep.h index d6ba7224980..02bcc145607 100644 --- a/libexec/ld.so/alpha/archdep.h +++ b/libexec/ld.so/alpha/archdep.h @@ -1,4 +1,4 @@ -/* $OpenBSD: archdep.h,v 1.21 2017/10/27 16:47:08 mpi Exp $ */ +/* $OpenBSD: archdep.h,v 1.22 2018/11/22 21:37:30 guenther Exp $ */ /* * Copyright (c) 1998 Per Fogelstrom, Opsycon AB @@ -42,7 +42,7 @@ static inline void RELOC_DYN(Elf64_Rela *r, const Elf64_Sym *s, Elf64_Addr *p, unsigned long v) { if (ELF64_R_TYPE(r->r_info) == RELOC_RELATIVE) { - /* handled by _reloc_alpha_got */ + *p += v; } else if (ELF64_R_TYPE(r->r_info) == RELOC_NONE) { /* nothing to do */ } else if (ELF64_R_TYPE(r->r_info) == RELOC_JMP_SLOT) { diff --git a/libexec/ld.so/alpha/ldasm.S b/libexec/ld.so/alpha/ldasm.S index ebb507b0d70..d1019f63fbf 100644 --- a/libexec/ld.so/alpha/ldasm.S +++ b/libexec/ld.so/alpha/ldasm.S @@ -1,4 +1,4 @@ -/* $OpenBSD: ldasm.S,v 1.41 2018/11/12 02:33:42 guenther Exp $ */ +/* $OpenBSD: ldasm.S,v 1.42 2018/11/22 21:37:30 guenther Exp $ */ /* * Copyright (c) 2001 Niklas Hallqvist @@ -70,15 +70,11 @@ L1: L2: ldiq s3, L2 /* get where the linker thought we were */ subq s2, s3, s2 - mov s2, a1 lda t5, _DYNAMIC - addq s2, t5, a0 - mov a0, s6 - - bsr ra, _reloc_alpha_got + addq s2, t5, s6 /* allocate stack */ - lda sp, (-8 - ((AUX_entry) * 8))(sp) + lda sp, -((AUX_entry + 1) * 8)(sp) mov s0, a0 mov s2, s1 /* relocation displacement */ @@ -93,7 +89,11 @@ L2: ldiq s3, L2 /* get where the linker thought we were */ lda s2, 0(sp) mov s2, a1 mov s6, a2 /* &_DYNAMIC */ - CALL(_dl_boot_bind) + /* we can't use CALL here as gp would not be set correctly by ldgp, + due to the GOT not being relocated yet. */ + lda pv, _dl_boot_bind + addq s1, pv, pv + bsr ra, _dl_boot_bind mov s3, a0 /* **argv */ mov s4, a1 /* **envp */ mov s1, a2 /* loff */ @@ -108,7 +108,7 @@ END(_dl_start) /* * Lazy binding entry point, called via secure (read-only) PLT. */ -NESTED_NOPROFILE(_dl_bind_secureplt, 0, 168, ra, 0, 0) +NESTED_NOPROFILE(_dl_bind_start, 0, 160, ra, 0, 0) .set noat /* at_reg and t11 already used by PLT code. */ @@ -179,4 +179,4 @@ NESTED_NOPROFILE(_dl_bind_secureplt, 0, 168, ra, 0, 0) /* Pop the stack frame and turn control to the destination. */ lda sp, 160(sp) jmp zero, (pv) -END(_dl_bind_secureplt) +END(_dl_bind_start) diff --git a/libexec/ld.so/alpha/rtld_machine.c b/libexec/ld.so/alpha/rtld_machine.c index 0cb712d2533..6c9a81539ea 100644 --- a/libexec/ld.so/alpha/rtld_machine.c +++ b/libexec/ld.so/alpha/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.64 2018/11/16 21:15:47 guenther Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.65 2018/11/22 21:37:30 guenther Exp $ */ /* * Copyright (c) 1999 Dale Rahn @@ -253,7 +253,7 @@ _dl_bind(elf_object_t *object, int reloff) return (buf.newval); } -void _dl_bind_secureplt(void) __dso_hidden; /* XXX */ +void _dl_bind_start(void) __dso_hidden; /* XXX */ /* * Relocate the Global Offset Table (GOT). @@ -290,39 +290,9 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) *addr += object->obj_base; } } - pltgot[0] = (Elf_Addr)_dl_bind_secureplt; + pltgot[0] = (Elf_Addr)_dl_bind_start; pltgot[1] = (Elf_Addr)object; } return (fails); } - -/* relocate the GOT early */ - -void _reloc_alpha_got(Elf_Dyn *dynp, Elf_Addr relocbase); - -void -_reloc_alpha_got(Elf_Dyn *dynp, Elf_Addr relocbase) -{ - const Elf_RelA *rela = NULL, *relalim; - Elf_Addr relasz = 0; - Elf_Addr *where; - - for (; dynp->d_tag != DT_NULL; dynp++) { - switch (dynp->d_tag) { - case DT_RELA: - rela = (const Elf_RelA *)(relocbase + dynp->d_un.d_ptr); - break; - case DT_RELASZ: - relasz = dynp->d_un.d_val; - break; - } - } - relalim = (const Elf_RelA *)((caddr_t)rela + relasz); - for (; rela < relalim; rela++) { - if (ELF64_R_TYPE(rela->r_info) != RELOC_RELATIVE) - continue; - where = (Elf_Addr *)(relocbase + rela->r_offset); - *where += (Elf_Addr)relocbase; - } -} |