Skip to content

Commit

Permalink
[ELF] -r: fix R_*_NONE to section symbols on Elf*_Rel targets
Browse files Browse the repository at this point in the history
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
  • Loading branch information
MaskRay committed May 17, 2019
1 parent 62c7032 commit f3a3b93
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lld/ELF/InputSection.cpp
Expand Up @@ -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});
}
}
Expand Down
7 changes: 7 additions & 0 deletions lld/test/ELF/relocation-none-arm.s
Expand Up @@ -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
Expand Down
7 changes: 7 additions & 0 deletions lld/test/ELF/relocation-none-i386.s
Expand Up @@ -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
Expand Down

0 comments on commit f3a3b93

Please sign in to comment.