From 1d4c0092a82aa351c5a6e9e501cc5edbc6c0477f Mon Sep 17 00:00:00 2001 From: Arthur Eubanks Date: Wed, 17 Jan 2024 16:38:59 -0700 Subject: [PATCH] [lld/ELF] Hint if R_X86_64_PC32 overflows and references a SHF_X86_64_LARGE section (#73045) Makes it clearer what the issue is when hand-written assembly doesn't follow medium code model assumptions in a medium code model build. Alternative to #71248 by only hinting on an overflow. --- lld/ELF/Relocations.cpp | 7 +++++++ lld/test/ELF/x86-64-pc32-overflow-large.s | 25 +++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 lld/test/ELF/x86-64-pc32-overflow-large.s diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index af974d0f90e1d..59b0220795871 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -105,6 +105,13 @@ void elf::reportRangeError(uint8_t *loc, const Relocation &rel, const Twine &v, hint = "; references '" + lld::toString(*rel.sym) + '\''; else if (auto *d = dyn_cast(rel.sym)) hint = ("; references section '" + d->section->name + "'").str(); + + if (config->emachine == EM_X86_64 && rel.type == R_X86_64_PC32 && + rel.sym->getOutputSection() && + (rel.sym->getOutputSection()->flags & SHF_X86_64_LARGE)) { + hint += "; R_X86_64_PC32 should not reference a section marked " + "SHF_X86_64_LARGE"; + } } if (!errPlace.srcLoc.empty()) hint += "\n>>> referenced by " + errPlace.srcLoc; diff --git a/lld/test/ELF/x86-64-pc32-overflow-large.s b/lld/test/ELF/x86-64-pc32-overflow-large.s new file mode 100644 index 0000000000000..fb8f3e4480c40 --- /dev/null +++ b/lld/test/ELF/x86-64-pc32-overflow-large.s @@ -0,0 +1,25 @@ +# REQUIRES: x86 +# RUN: split-file %s %t +# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/a.s -o %t/a.o +# RUN: not ld.lld %t/a.o -T %t/lds -o /dev/null 2>&1 | FileCheck %s + +# CHECK: error: {{.*}}a.o:(.text+{{.*}}): relocation R_X86_64_PC32 out of range: {{.*}}; R_X86_64_PC32 should not reference a section marked SHF_X86_64_LARGE + +#--- a.s +.text +.globl _start +.type _start, @function +_start: + movq hello(%rip), %rax + +.section ldata,"awl",@progbits +.type hello, @object +.globl hello +hello: +.long 1 + +#--- lds +SECTIONS { + .text 0x100000 : { *(.text) } + ldata 0x80200000 : { *(ldata) } +}