libhugetlbfs: Fix linking tests with lld

ld.hugetlbfs runs $LD as the real linker and adds the GNU ld only
-Ttext-segment option for --hugetlbfs-align links on arm/aarch64, i386 and
ppc64. Now that LD is ld.lld this fails with

  ld.lld: error: -Ttext-segment is not supported. Use --image-base if you intend to set the base address

Teach ld.hugetlbfs to use --image-base when the linker is LLD.

AI-Generated: Uses Claude Code
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
This commit is contained in:
Khem Raj committed 2026-11-11 18:20:12 -08:00
1 parent 8572efb2a3
commit df8e11bdb6
2 files changed
+58

No files matched your search

@@ -0,0 +1,57 @@
From 49b8283544ae5c897f4cf186e174f98a9dc6e1c6 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Wed, 11 Nov 2026 07:56:45 -0800
Subject: [PATCH] ld.hugetlbfs: Use --image-base with LLD
LLD does not implement the GNU ld -Ttext-segment option and errors out:
ld.lld: error: -Ttext-segment is not supported. Use --image-base if you intend to set the base address
which breaks linking the --hugetlbfs-align testcases when LD is lld. Detect
LLD and pass the equivalent --image-base instead. LLD reads the value with
base auto-detection, so emit the address with a 0x prefix, which GNU ld also
accepts.
Upstream-Status: Submitted [https://github.com/libhugetlbfs/libhugetlbfs/pull/118]
Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
ld.hugetlbfs | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/ld.hugetlbfs b/ld.hugetlbfs
index d4a6306..11db0cf 100755
--- a/ld.hugetlbfs
+++ b/ld.hugetlbfs
@@ -126,6 +126,12 @@ armelf*_linux_eabi|aarch64elf*|aarch64linux*)
SLICE_SIZE=$HPAGE_SIZE ;;
esac
+# LLD does not implement -Ttext-segment, --image-base is its equivalent
+TEXTSEG="-Ttext-segment="
+if ${LD} --version 2>/dev/null | grep -q "^LLD"; then
+ TEXTSEG="--image-base="
+fi
+
if [ "$HTLB_ALIGN" == "slice" ]; then
HTLBOPTS="-zcommon-page-size=$SLICE_SIZE -zmax-page-size=$SLICE_SIZE"
HTLBOPTS="$HTLBOPTS -lhugetlbfs"
@@ -134,13 +140,13 @@ if [ "$HTLB_ALIGN" == "slice" ]; then
# otherwise it will be NULL.
case "$EMU" in
armelf*_linux_eabi|aarch64elf*|aarch64linux*)
- printf -v TEXTADDR "%x" "$SLICE_SIZE"
- HTLBOPTS="$HTLBOPTS -Ttext-segment=$TEXTADDR" ;;
- elf_i386) HTLBOPTS="$HTLBOPTS -Ttext-segment=0x08000000" ;;
+ printf -v TEXTADDR "0x%x" "$SLICE_SIZE"
+ HTLBOPTS="$HTLBOPTS ${TEXTSEG}$TEXTADDR" ;;
+ elf_i386) HTLBOPTS="$HTLBOPTS ${TEXTSEG}0x08000000" ;;
elf64ppc|elf64lppc)
if [ "$MMU_TYPE" == "Hash" ] ; then
- printf -v TEXTADDR "%x" "$SLICE_SIZE"
- HTLBOPTS="$HTLBOPTS -Ttext-segment=$TEXTADDR"
+ printf -v TEXTADDR "0x%x" "$SLICE_SIZE"
+ HTLBOPTS="$HTLBOPTS ${TEXTSEG}$TEXTADDR"
fi ;;
esac
fi
@@ -26,6 +26,7 @@ SRC_URI = " \
file://0013-elflink.c-include-libgen.h-for-basename.patch \
file://0014-tests-Add-ldflags-to-linker-commandline-for-libheaps.patch \
file://0015-support-reproducible-builds.patch \
file://0016-ld.hugetlbfs-Use-image-base-with-LLD.patch \
"
UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>\d+(\.\d+)+)"