[ELF] -r: fix R_*_NONE to section symbols on Elf*_Rel targets

On Elf*_Rel targets, for a relocation to a section symbol, an R_ABS is
added which will be used by relocateOne() to compute the implicit
addend.

Addends of R_*_NONE should be ignored, so don't emit an R_ABS.

This fixes crashes on X86 and ARM because their relocateOne() do not
handle R_*_NONE.

Reviewed By: peter.smith

Differential Revision: https://reviews.llvm.org/D62052

llvm-svn: 361036
This commit is contained in:
Fangrui Song 2019-05-17 14:11:03 +00:00
parent 62c7032c18
commit f3a3b93f54
3 changed files with 15 additions and 1 deletions

View File

@ -470,7 +470,7 @@ void InputSection::copyRelocations(uint8_t *Buf, ArrayRef<RelTy> Rels) {
if (RelTy::IsRela)
P->r_addend = Sym.getVA(Addend) - Section->getOutputSection()->Addr;
else if (Config->Relocatable)
else if (Config->Relocatable && Type != Target->NoneRel)
Sec->Relocations.push_back({R_ABS, Type, Rel.r_offset, Addend, &Sym});
}
}

View File

@ -8,6 +8,13 @@
# CHECK: .data
# CHECK: There are no relocations in this file.
# RUN: ld.lld -r %t.o -o %t
# RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOC %s
# RELOC: Section ({{.*}}) .rel.text {
# RELOC-NEXT: 0x0 R_ARM_NONE .data 0x0
# RELOC-NEXT: }
.globl _start
_start:
nop

View File

@ -8,6 +8,13 @@
# CHECK: .data
# CHECK: There are no relocations in this file.
# RUN: ld.lld -r %t.o -o %t
# RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOC %s
# RELOC: Section ({{.*}}) .rel.text {
# RELOC-NEXT: 0x0 R_386_NONE .data 0x0
# RELOC-NEXT: }
.globl _start
_start:
ret