`R_X86_64_GOTTPOFF` linking error in x32 architecture.
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
(this is a continuation of https://github.com/ziglang/zig/issues/25374)
This issue exists in LLVM 18(?) to 21 and there isn't any resolve yet. hopefully this gets fixed.
The Error:
```bash
2025-09-27T15:02:44.6910810Z FAILED: [code=1] bin/lld
2025-09-27T15:02:44.6942420Z : && /home/runner/work/llvm-custom-experimental/llvm-custom-experimental/zig-as-llvm/bin/c++ -fstack-protector-strong -fsanitize=undefined -static -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -Os -DNDEBUG -static -static -fno-pie -Wl,--color-diagnostics tools/lld/tools/lld/CMakeFiles/lld.dir/lld.cpp.o tools/lld/tools/lld/CMakeFiles/lld.dir/lld-driver.cpp.o -o bin/lld -Wl,-rpath,"\$ORIGIN/../lib:" lib/libLLVMSupport.a lib/libLLVMTargetParser.a lib/liblldCommon.a lib/liblldCOFF.a lib/liblldELF.a lib/liblldMachO.a lib/liblldMinGW.a lib/liblldWasm.a lib/liblldCOFF.a lib/libLLVMLibDriver.a lib/libLLVMWindowsDriver.a lib/libLLVMWindowsManifest.a lib/liblldCommon.a lib/libLLVMOption.a lib/libLLVMX86CodeGen.a lib/libLLVMX86AsmParser.a lib/libLLVMX86Desc.a lib/libLLVMX86Disassembler.a lib/libLLVMX86Info.a lib/libLLVMAArch64CodeGen.a lib/libLLVMAArch64AsmParser.a lib/libLLVMAArch64Disassembler.a lib/libLLVMAArch64Desc.a lib/libLLVMAArch64Info.a lib/libLLVMAArch64Utils.a lib/libLLVMARMCodeGen.a lib/libLLVMARMAsmParser.a lib/libLLVMARMDisassembler.a lib/libLLVMARMDesc.a lib/libLLVMARMInfo.a lib/libLLVMARMUtils.a lib/libLLVMRISCVCodeGen.a lib/libLLVMAsmPrinter.a lib/libLLVMGlobalISel.a lib/libLLVMSelectionDAG.a lib/libLLVMRISCVAsmParser.a lib/libLLVMRISCVDisassembler.a lib/libLLVMRISCVDesc.a lib/libLLVMMCDisassembler.a lib/libLLVMRISCVInfo.a lib/libLLVMLTO.a lib/libLLVMExtensions.a lib/libLLVMPasses.a lib/libLLVMCodeGen.a lib/libLLVMCGData.a lib/libLLVMCodeGenTypes.a lib/libLLVMTarget.a lib/libLLVMObjCARCOpts.a lib/libLLVMCFGuard.a lib/libLLVMIRPrinter.a lib/libLLVMCoroutines.a lib/libLLVMipo.a lib/libLLVMBitWriter.a lib/libLLVMInstrumentation.a lib/libLLVMVectorize.a lib/libLLVMSandboxIR.a lib/libLLVMLinker.a lib/libLLVMFrontendOpenMP.a lib/libLLVMScalarOpts.a lib/libLLVMAggressiveInstCombine.a lib/libLLVMInstCombine.a lib/libLLVMFrontendOffloading.a lib/libLLVMFrontendAtomic.a lib/libLLVMHipStdPar.a lib/libLLVMTransformUtils.a lib/libLLVMAnalysis.a lib/libLLVMProfileData.a lib/libLLVMSymbolize.a lib/libLLVMDebugInfoDWARF.a lib/libLLVMDebugInfoPDB.a lib/libLLVMDebugInfoCodeView.a lib/libLLVMDebugInfoMSF.a lib/libLLVMObject.a lib/libLLVMTextAPI.a lib/libLLVMMCParser.a lib/libLLVMMC.a lib/libLLVMIRReader.a lib/libLLVMBitReader.a lib/libLLVMAsmParser.a lib/libLLVMCore.a lib/libLLVMRemarks.a lib/libLLVMBitstreamReader.a lib/libLLVMBinaryFormat.a lib/libLLVMTargetParser.a lib/libLLVMDebugInfoBTF.a lib/libLLVMSupport.a -lrt -ldl -lm /home/runner/work/llvm-custom-experimental/llvm-custom-experimental/output/x86_64-linux-muslx32/lib/libz.a /home/runner/work/llvm-custom-experimental/llvm-custom-experimental/output/x86_64-linux-muslx32/lib/libzstd.a lib/libLLVMDemangle.a && cd /home/runner/work/llvm-custom-experimental/llvm-custom-experimental/build/x86_64-linux-muslx32/tools/lld/tools/lld && /usr/local/bin/cmake -E create_symlink lld /home/runner/work/llvm-custom-experimental/llvm-custom-experimental/build/x86_64-linux-muslx32/./bin/lld-link && cd /home/runner/work/llvm-custom-experimental/llvm-custom-experimental/build/x86_64-linux-muslx32/tools/lld/tools/lld && /usr/local/bin/cmake -E create_symlink lld /home/runner/work/llvm-custom-experimental/llvm-custom-experimental/build/x86_64-linux-muslx32/./bin/ld.lld && cd /home/runner/work/llvm-custom-experimental/llvm-custom-experimental/build/x86_64-linux-muslx32/tools/lld/tools/lld && /usr/local/bin/cmake -E create_symlink lld /home/runner/work/llvm-custom-experimental/llvm-custom-experimental/build/x86_64-linux-muslx32/./bin/ld64.lld && cd /home/runner/work/llvm-custom-experimental/llvm-custom-experimental/build/x86_64-linux-muslx32/tools/lld/tools/lld && /usr/local/bin/cmake -E create_symlink lld /home/runner/work/llvm-custom-experimental/llvm-custom-experimental/build/x86_64-linux-muslx32/./bin/wasm-ld
2025-09-27T15:02:44.6981900Z ld.lld: error: lib/liblldELF.a(Relocations.cpp.o):(function void addRelativeReloc(lld::elf::Ctx&, lld::elf::InputSectionBase&, unsigned long long, lld::elf::Symbol&, long long, lld::elf::RelExpr, lld::elf::RelType): .text._ZL16addRelativeRelocILb1EEvRN3lld3elf3CtxERNS1_16InputSectionBaseEyRNS1_6SymbolExNS1_7RelExprENS1_7RelTypeE+0xf6): R_X86_64_GOTTPOFF must be used in MOVQ or ADDQ instructions only
2025-09-27T15:02:44.6987419Z ld.lld: error: lib/liblldELF.a(Relocations.cpp.o):(function void lld::elf::RelocationBaseSection::addReloc(lld::elf::DynamicReloc::Kind, lld::elf::RelType, lld::elf::InputSectionBase&, unsigned long long, lld::elf::Symbol&, long long, lld::elf::RelExpr, lld::elf::RelType): .text._ZN3lld3elf21RelocationBaseSection8addRelocILb1EEEvNS0_12DynamicReloc4KindENS0_7RelTypeERNS0_16InputSectionBaseEyRNS0_6SymbolExNS0_7RelExprES5_+0x137): R_X86_64_GOTTPOFF must be used in MOVQ or ADDQ instructions only
```
CMake Flags I use:
```bash
cmake -S "$ROOTDIR/llvm" -B "${TARGET_BUILD_DIR}" -G Ninja \
-DCMAKE_INSTALL_PREFIX="${ROOTDIR}/llvm-${{matrix.target}}" \
-DCMAKE_PREFIX_PATH="${TARGET_INSTALL_DIR}" \
-DLLVM_TARGETS_TO_BUILD="X86;AArch64;ARM;RISCV" \
-DCMAKE_BUILD_TYPE=MinSizeRel \
-DCMAKE_CROSSCOMPILING=True \
-DCMAKE_SYSTEM_NAME=Linux \
-DLLVM_DEFAULT_TARGET_TRIPLE=${{matrix.target}} \
-DCMAKE_C_COMPILER="${TOOLCHAIN}/bin/cc" \
-DCMAKE_CXX_COMPILER="${TOOLCHAIN}/bin/c++" \
-DCMAKE_ASM_COMPILER="${TOOLCHAIN}/bin/cc" \
-DCMAKE_LINKER="${TOOLCHAIN}/bin/ld" \
-DCMAKE_OBJCOPY="${TOOLCHAIN}/bin/objcopy" \
-DCMAKE_AR="${TOOLCHAIN}/bin/ar" \
-DCMAKE_RANLIB="${TOOLCHAIN}/bin/ranlib" \
-DCMAKE_STRIP="${TOOLCHAIN}/bin/strip" \
-DCMAKE_C_FLAGS="-fstack-protector-strong -fsanitize=undefined -static" \
-DCMAKE_CXX_FLAGS="-fstack-protector-strong -fsanitize=undefined -static" \
-DCMAKE_EXE_LINKER_FLAGS="-static" \
-DLLVM_ENABLE_PROJECTS="${{inputs.projects}}" \
-DLLVM_ENABLE_ZLIB=FORCE_ON \
-DLLVM_ENABLE_ZSTD=FORCE_ON \
-DLLVM_USE_STATIC_ZSTD=ON \
-DLLVM_BUILD_STATIC=ON \
-DCLANG_ENABLE_ARCMT=OFF \
-DLLVM_LINK_LLVM_DYLIB=OFF \
-DLIBCLANG_BUILD_STATIC=ON \
-DCMAKE_SKIP_INSTALL_RPATH=TRUE \
-DBUILD_SHARED_LIBS=OFF \
-DLLVM_INCLUDE_BENCHMARKS=OFF \
-DLLVM_BUILD_BENCHMARKS=OFF \
-DLLVM_INCLUDE_EXAMPLES=OFF \
-DLLVM_BUILD_EXAMPLES=OFF \
-DLLVM_BUILD_TESTS=OFF \
-DLLVM_BUILD_TOOLS=ON \
-DLLVM_INCLUDE_TESTS=OFF \
-DCLANG_INCLUDE_TESTS=OFF \
-DCLANG_BUILD_TESTS=OFF \
-DLLVM_TOOL_C_TEST_BUILD=OFF \
-DCLANG_TOOL_CLANG_IMPORT_TEST_BUILD=OFF \
-DCLANG_TOOL_APINOTES_TEST_BUILD=OFF \
-DCLANG_TOOL_ARCMT_TEST_BUILD=OFF \
-DCLANG_TOOL_C_ARCMT_TEST_BUILD=OFF \
-DCLANG_TOOL_C_INDEX_TEST_BUILD=OFF \
-DLLVM_PARALLEL_LINK_JOBS=1 \
-DLLVM_ENABLE_PIC=OFF \
-DLLVM_ENABLE_LIBCXX=OFF \
-DLLVM_ENABLE_LLVM_LIBC=OFF \
-DLLVM_ENABLE_UNWIND_TABLES=OFF \
-DLLVM_ENABLE_EH=OFF \
-DLLVM_ENABLE_RTTI=OFF \
-DLLVM_ENABLE_LTO=OFF \
-DLLVM_ENABLE_TERMINFO=OFF \
-DLLVM_ENABLE_MODULES=OFF \
-DLLVM_ENABLE_PEDANTIC=OFF \
-DLLVM_ENABLE_FFI=OFF \
-DLLVM_ENABLE_LIBPFM=OFF \
-DLLVM_ENABLE_LIBEDIT=OFF \
-DLLVM_ENABLE_LIBXML2=OFF \
-DLLVM_ENABLE_CURL=OFF \
-DLLVM_ENABLE_THREADS=ON \
-DLLVM_VERSION_SUFFIX="" \
-DCLANG_VENDOR="Android" \
-DCLANG_REPOSITORY_STRING="https://github.com/${{ github.repository_owner }}/llvm-custom" \
-DPACKAGE_BUGREPORT="https://github.com/${{ github.repository_owner }}/android-ndk-custom/issues/"
```
Contributor guide
Research direction
Start by reproducing the x32 build with the provided CMake flags and lld link command. Inspect the reported Relocations.cpp.o diagnostics for R_X86_64_GOTTPOFF and compare the failing link behavior across the affected LLVM versions. Done means the x32 LLVM build completes without this linker error, with an appropriate regression test if the relevant test location is identified.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cmake, cpp, linux
- Domain
- build-system, compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100