[PATCH v2] Make the segment base match pinned section address
Khem Raj
raj.khem at gmail.com
Thu Sep 4 20:22:52 PDT 2025
ET_EXEC uses image base of 0x400000, but the build forces
section VMAs like .text = 0x10000. LLD now errors when any
section address is below the image base unless you explicitly
set the base. (Older LLD tolerated it.)
To fix this
use a tiny linker script to keep .text at 0x10000 and avoid .note overlap
With hardcoded -Ttext,0x10000 and newer toolchains emitting
.note.gnu.property before .text, the link can fail with an overlap.
Provide a minimal linker script that:
- sets the image base to 0x10000,
- places .text first at exactly 0x10000,
- moves .note.gnu.property after .text,
- optionally fixes .bss at 0x12000.
Works with both ld.bfd and LLD 21+.
Fixes
| x86_64-yoe-linux-ld.lld: error: section '.text' address (0x10000) is smaller than image base (0x400000); specify --image-base
| x86_64-yoe-linux-ld.lld: error: section '.bss' address (0x12000) is smaller than image base (0x400000); specify --image-base
Signed-off-by: Khem Raj <raj.khem at gmail.com>
---
v2: Use a tiny linker script instead of trying to use linker options like -Ttext
to make it portable across BFD linker and LLD
kexec_test/Makefile | 4 ++--
kexec_test/kexec_test.ld | 16 ++++++++++++++++
2 files changed, 18 insertions(+), 2 deletions(-)
create mode 100644 kexec_test/kexec_test.ld
diff --git a/kexec_test/Makefile b/kexec_test/Makefile
index fec6210..2ae66af 100644
--- a/kexec_test/Makefile
+++ b/kexec_test/Makefile
@@ -5,7 +5,7 @@ RELOC:=0x10000
KEXEC_TEST_SRCS:= kexec_test/kexec_test16.S kexec_test/kexec_test.S
dist += kexec_test/Makefile $(KEXEC_TEST_SRCS) \
- kexec_test/x86-setup-legacy-pic.S
+ kexec_test/x86-setup-legacy-pic.S kexec_test/kexec_test.ld
BUILD_KEXEC_TEST = no
ifeq ($(ARCH),i386)
@@ -31,7 +31,7 @@ $(KEXEC_TEST): CPPFLAGS+=-DRELOC=$(RELOC)
$(KEXEC_TEST): ASFLAGS+=-m32
#$(KEXEC_TEST): LDFLAGS=-m32 -Wl,-e -Wl,_start -Wl,-Ttext -Wl,$(RELOC) \
# -nostartfiles
-$(KEXEC_TEST): LDFLAGS=-melf_i386 -e _start -Ttext $(RELOC)
+$(KEXEC_TEST): LDFLAGS=-melf_i386 -e _start -T $(srcdir)/kexec_test/kexec_test.ld
$(KEXEC_TEST): $(KEXEC_TEST_OBJS)
mkdir -p $(@D)
diff --git a/kexec_test/kexec_test.ld b/kexec_test/kexec_test.ld
new file mode 100644
index 0000000..f68dcf8
--- /dev/null
+++ b/kexec_test/kexec_test.ld
@@ -0,0 +1,16 @@
+ENTRY(_start)
+SECTIONS
+{
+ . = 0x10000;
+ .text : { *(.text .text.*) }
+
+ /* Place the note after .text to avoid overlap */
+ . = ALIGN(16);
+ .note.gnu.property : { *(.note.gnu.property) }
+
+ .rodata : { *(.rodata .rodata.*) }
+
+ /* If you need bss fixed: */
+ . = 0x12000;
+ .bss : { *(.bss .bss.* COMMON) }
+}
More information about the kexec
mailing list