mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-13 11:35:20 +01:00
See https://sourceware.org/bugzilla/show_bug.cgi?id=28509. https://sourceware.org/git/?p=glibc.git;a=commit;h=68389203832ab39dd0dbaabbc4059e7fff51c29b.
57 lines
1.8 KiB
Diff
57 lines
1.8 KiB
Diff
commit 68389203832ab39dd0dbaabbc4059e7fff51c29b
|
|
Author: Fangrui Song <maskray@google.com>
|
|
Date: Thu Oct 28 11:39:49 2021 -0700
|
|
|
|
riscv: Fix incorrect jal with HIDDEN_JUMPTARGET
|
|
|
|
A non-local STV_DEFAULT defined symbol is by default preemptible in a
|
|
shared object. j/jal cannot target a preemptible symbol. On other
|
|
architectures, such a jump instruction either causes PLT [BZ #18822], or
|
|
if short-ranged, sometimes rejected by the linker (but not by GNU ld's
|
|
riscv port [ld PR/28509]).
|
|
|
|
Use HIDDEN_JUMPTARGET to target a non-preemptible symbol instead.
|
|
|
|
With this patch, ld.so and libc.so can be linked with LLD if source
|
|
files are compiled/assembled with -mno-relax/-Wa,-mno-relax.
|
|
|
|
Acked-by: Palmer Dabbelt <palmer@dabbelt.com>
|
|
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
|
|
|
Can be dropped when we are using glibc 2.35 or later.
|
|
|
|
diff --git a/sysdeps/riscv/setjmp.S b/sysdeps/riscv/setjmp.S
|
|
index 0b92016b31..bec7ff80f4 100644
|
|
--- a/sysdeps/riscv/setjmp.S
|
|
+++ b/sysdeps/riscv/setjmp.S
|
|
@@ -21,7 +21,7 @@
|
|
|
|
ENTRY (_setjmp)
|
|
li a1, 0
|
|
- j __sigsetjmp
|
|
+ j HIDDEN_JUMPTARGET (__sigsetjmp)
|
|
END (_setjmp)
|
|
ENTRY (setjmp)
|
|
li a1, 1
|
|
diff --git a/sysdeps/unix/sysv/linux/riscv/setcontext.S b/sysdeps/unix/sysv/linux/riscv/setcontext.S
|
|
index 9510518750..e44a68aad4 100644
|
|
--- a/sysdeps/unix/sysv/linux/riscv/setcontext.S
|
|
+++ b/sysdeps/unix/sysv/linux/riscv/setcontext.S
|
|
@@ -95,6 +95,7 @@ LEAF (__setcontext)
|
|
99: j __syscall_error
|
|
|
|
END (__setcontext)
|
|
+libc_hidden_def (__setcontext)
|
|
weak_alias (__setcontext, setcontext)
|
|
|
|
LEAF (__start_context)
|
|
@@ -108,7 +109,7 @@ LEAF (__start_context)
|
|
/* Invoke subsequent context if present, else exit(0). */
|
|
mv a0, s2
|
|
beqz s2, 1f
|
|
- jal __setcontext
|
|
-1: j exit
|
|
+ jal HIDDEN_JUMPTARGET (__setcontext)
|
|
+1: j HIDDEN_JUMPTARGET (exit)
|
|
|
|
END (__start_context)
|