aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Hutchings <ben@decadent.org.uk>2023-07-16 12:27:49 +0200
committerBen Hutchings <ben@decadent.org.uk>2023-07-16 17:50:44 +0200
commit78279e5b41c6958882d7e258edf457f74c515f34 (patch)
tree526099f98af57a86894b835d2c4ad6585add5aa5
parente25809bbea2ed2825c543cb153d9f282eac26fc5 (diff)
downloadklibc-78279e5b41c6958882d7e258edf457f74c515f34.tar.gz
[klibc] arm: Move shared library below executables
The default base address for arm executables is 64 kiB, and the base address for the shared library is 3.5 MiB when generating Thumb instructions. This limits the size of executables using it to be < 3.5 MiB, and it also interacts with a bug in QEMU's user-mode emulation, causing executables to immediately crash. Moving the shared library to the end of the 16 MiB range didn't help. Instead, move the shared library to 2 MiB and executables to 4 MiB. This works for both Thumb and non-Thumb configurations, so make it unconditional. References: https://bugs.debian.org/1040981 Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r--usr/klibc/arch/arm/MCONFIG12
1 files changed, 8 insertions, 4 deletions
diff --git a/usr/klibc/arch/arm/MCONFIG b/usr/klibc/arch/arm/MCONFIG
index 41f39a0e09e7d..db5b14ac59b8f 100644
--- a/usr/klibc/arch/arm/MCONFIG
+++ b/usr/klibc/arch/arm/MCONFIG
@@ -19,12 +19,8 @@ ifeq ($(CONFIG_KLIBC_THUMB),y)
CPU_ARCH := $(CPU_ARCH)t
KLIBCREQFLAGS += -mthumb
KLIBCREQFLAGS += -mabi=aapcs-linux
-KLIBCSHAREDFLAGS = $(LD_IMAGE_BASE_OPT) 0x380000
else
# Extra linkflags when building the shared version of the library
-# This address needs to be reachable using normal inter-module
-# calls, and work on the memory models for this architecture
-KLIBCSHAREDFLAGS = $(LD_IMAGE_BASE_OPT) 0x01800000
ifeq ($(CONFIG_AEABI),y)
KLIBCREQFLAGS += -mabi=aapcs-linux -mno-thumb-interwork
else
@@ -32,5 +28,13 @@ KLIBCREQFLAGS += -mabi=apcs-gnu -mno-thumb-interwork
endif
endif
+# Normal binaries start at 64 kiB. A32 branch instructions have a
+# range of ±32 MiB and T32 branch instructions only ±16 MiB, so we
+# have to put klibc.so in that range. Putting it close above the
+# executable can cause breakage, so instead swap them around:
+# klibc.so at 2 MiB and executable at 4 MiB.
+KLIBCLDFLAGS = $(LD_IMAGE_BASE_OPT) 0x400000
+KLIBCSHAREDFLAGS = $(LD_IMAGE_BASE_OPT) 0x200000
+
# Kernel uses dedicated page or vDSO for signal return since 2.6.13
KLIBCEXECSTACK := n