[klibc] [klibc:master] riscv64: Move shared library below executables

klibc-bot for Ben Hutchings ben at decadent.org.uk
Sun Jul 23 13:27:08 PDT 2023


Commit-ID:  cb608840b3a93fb7d2409012b8845b4d1c3fa91d
Gitweb:     http://git.kernel.org/?p=libs/klibc/klibc.git;a=commit;h=cb608840b3a93fb7d2409012b8845b4d1c3fa91d
Author:     Ben Hutchings <ben at decadent.org.uk>
AuthorDate: Sun, 16 Jul 2023 17:50:57 +0200
Committer:  Ben Hutchings <ben at decadent.org.uk>
CommitDate: Sun, 16 Jul 2023 17:50:57 +0200

[klibc] riscv64: Move shared library below executables

The default base address for riscv64 executables is 64 kiB, and I
originally selected a base address for the shared library of 2 MiB.
This limits the size of executables using it to be < 2 MiB, and it
also interacts with a bug in QEMU's user-mode emulation, causing
executables to immediately crash.  It doesn't help code generation,
because single-instruction jumps have a range of only ±1 MiB and
two-instruction jumps have a range of ±2 GiB.

Move the shared library to 64 kiB and executables to 576 kiB, to allow
for generation of single-instruction jumps.  (klibc.so is currently
much smaller than the 512 kiB this allows for.)

References: https://bugs.debian.org/1040981
Signed-off-by: Ben Hutchings <ben at decadent.org.uk>

---
 usr/klibc/arch/riscv64/MCONFIG | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/usr/klibc/arch/riscv64/MCONFIG b/usr/klibc/arch/riscv64/MCONFIG
index 34061086..717aedaa 100644
--- a/usr/klibc/arch/riscv64/MCONFIG
+++ b/usr/klibc/arch/riscv64/MCONFIG
@@ -13,8 +13,13 @@ KLIBCOPTFLAGS     += -g
 endif
 KLIBCBITSIZE      = 64
 
-# Normal binaries start at 64 KB, so start the libary at 2 MB.
-KLIBCSHAREDFLAGS  = $(LD_IMAGE_BASE_OPT) 0x00200000
+# Normal binaries start at 64 kiB. Jumps can use either a single
+# instruction with offset of ±1 MiB, or two instructions with offset
+# of ±2 GiB. Putting klibc.so close above the executable can cause
+# breakage, so instead swap them around: klibc.so at 64 kiB and
+# executable at 576 kiB.
+KLIBCLDFLAGS      = $(LD_IMAGE_BASE_OPT) 0x90000
+KLIBCSHAREDFLAGS  = $(LD_IMAGE_BASE_OPT) 0x10000
 KLIBCSHAREDFLAGS  += --defsym '__global_pointer$$=0'
 
 # Kernel has never used stack trampolines


More information about the klibc mailing list