forked from OSchip/llvm-project
[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:
parent
62c7032c18
commit
f3a3b93f54
|
@ -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});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue