Skip to content

Commit

Permalink
[lld/ELF] Hint if R_X86_64_PC32 overflows and references a SHF_X86_64…
Browse files Browse the repository at this point in the history
…_LARGE section (llvm#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 llvm#71248 by only hinting on an overflow.
  • Loading branch information
aeubanks authored Jan 17, 2024
1 parent 00647a1 commit 1d4c009
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 0 deletions.
7 changes: 7 additions & 0 deletions lld/ELF/Relocations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Defined>(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;
Expand Down
25 changes: 25 additions & 0 deletions lld/test/ELF/x86-64-pc32-overflow-large.s
Original file line number Diff line number Diff line change
@@ -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) }
}

0 comments on commit 1d4c009

Please sign in to comment.