From 1f5ed31e30b58cda608447b5f7c0d1532ab19eb9 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Sat, 23 May 1998 04:35:34 +0000 Subject: * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_fixup_plt): Always perform the flush during RTLD_BOOTSTRAP. --- ChangeLog.SPARC | 5 +++++ sysdeps/sparc/sparc32/dl-machine.h | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/ChangeLog.SPARC b/ChangeLog.SPARC index b5ed4f33d4..c12a5c236e 100644 --- a/ChangeLog.SPARC +++ b/ChangeLog.SPARC @@ -1,3 +1,8 @@ +1998-05-23 David S. Miller + + * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_fixup_plt): + Always perform the flush during RTLD_BOOTSTRAP. + 1998-05-21 David S. Miller * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list: Add diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h index ef041e2e11..fde559d999 100644 --- a/sysdeps/sparc/sparc32/dl-machine.h +++ b/sysdeps/sparc/sparc32/dl-machine.h @@ -274,6 +274,10 @@ elf_machine_fixup_plt (struct link_map *map, const Elf32_Rela *reloc, if we execute it and hw does not support it. */ __asm ("" : "=r" (hwcap) : "0" (hwcap)); do_flush = (!hwcap || (*hwcap & HWCAP_SPARC_FLUSH)); +#else + /* Unfortunately, this is necessary, so that we can ensure + ld.so will not execute corrupt PLT entry instructions. */ + const int do_flush = 1; #endif /* For thread safety, write the instructions from the bottom and @@ -282,16 +286,12 @@ elf_machine_fixup_plt (struct link_map *map, const Elf32_Rela *reloc, But we also can't tell if we _can_ use flush, so don't. */ reloc_addr[2] = OPCODE_JMP_G1 | (value & 0x3ff); -#ifndef RTLD_BOOTSTRAP if (do_flush) __asm __volatile ("flush %0+8" : : "r"(reloc_addr)); -#endif reloc_addr[1] = OPCODE_SETHI_G1 | (value >> 10); -#ifndef RTLD_BOOTSTRAP if (do_flush) __asm __volatile ("flush %0+4" : : "r"(reloc_addr)); -#endif } #ifdef RESOLVE -- cgit 1.4.1