[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