forked from OSchip/llvm-project
[ELF] Ignore R_*_NONE relocs when relocating non-alloc sections
We shouldn't report an error for R_*_NONE relocs since we're emitting them when writing relocations to discarded sections. Differential Revision: https://reviews.llvm.org/D30279 llvm-svn: 295936
This commit is contained in:
parent
0d6592a899
commit
b27bb59a5d
|
|
@ -308,6 +308,7 @@ getRelocTargetVA(uint32_t Type, int64_t A, typename ELFT::uint P,
|
|||
const SymbolBody &Body, RelExpr Expr) {
|
||||
switch (Expr) {
|
||||
case R_HINT:
|
||||
case R_NONE:
|
||||
case R_TLSDESC_CALL:
|
||||
llvm_unreachable("cannot relocate hint relocs");
|
||||
case R_TLSLD:
|
||||
|
|
@ -459,7 +460,10 @@ void InputSection<ELFT>::relocateNonAlloc(uint8_t *Buf, ArrayRef<RelTy> Rels) {
|
|||
Addend += Target->getImplicitAddend(BufLoc, Type);
|
||||
|
||||
SymbolBody &Sym = this->getFile<ELFT>()->getRelocTargetSym(Rel);
|
||||
if (Target->getRelExpr(Type, Sym) != R_ABS) {
|
||||
RelExpr Expr = Target->getRelExpr(Type, Sym);
|
||||
if (Expr == R_NONE)
|
||||
continue;
|
||||
if (Expr != R_ABS) {
|
||||
error(this->getLocation<ELFT>(Offset) + ": has non-ABS reloc");
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -694,6 +694,11 @@ static void scanRelocs(InputSectionBase &C, ArrayRef<RelTy> Rels) {
|
|||
reportUndefined<ELFT>(Body, C, RI.r_offset);
|
||||
|
||||
RelExpr Expr = Target->getRelExpr(Type, Body);
|
||||
|
||||
// Ignore "hint" relocations because they are only markers for relaxation.
|
||||
if (isRelExprOneOf<R_HINT, R_NONE>(Expr))
|
||||
continue;
|
||||
|
||||
bool Preemptible = isPreemptible(Body, Type);
|
||||
Expr = adjustExpr(*File, Body, IsWrite, Expr, Type, Buf + RI.r_offset, C,
|
||||
RI.r_offset);
|
||||
|
|
@ -732,9 +737,7 @@ static void scanRelocs(InputSectionBase &C, ArrayRef<RelTy> Rels) {
|
|||
continue;
|
||||
}
|
||||
|
||||
// Ignore "hint" and TLS Descriptor call relocation because they are
|
||||
// only markers for relaxation.
|
||||
if (isRelExprOneOf<R_HINT, R_TLSDESC_CALL>(Expr))
|
||||
if (Expr == R_TLSDESC_CALL)
|
||||
continue;
|
||||
|
||||
if (needsPlt(Expr) ||
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ enum RelExpr {
|
|||
R_MIPS_TLSGD,
|
||||
R_MIPS_TLSLD,
|
||||
R_NEG_TLS,
|
||||
R_NONE,
|
||||
R_PAGE_PC,
|
||||
R_PC,
|
||||
R_PLT,
|
||||
|
|
|
|||
|
|
@ -389,7 +389,7 @@ RelExpr X86TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
|
|||
case R_386_TLS_LE_32:
|
||||
return R_NEG_TLS;
|
||||
case R_386_NONE:
|
||||
return R_HINT;
|
||||
return R_NONE;
|
||||
default:
|
||||
error(toString(S.File) + ": unknown relocation type: " + toString(Type));
|
||||
return R_HINT;
|
||||
|
|
@ -684,7 +684,7 @@ RelExpr X86_64TargetInfo<ELFT>::getRelExpr(uint32_t Type,
|
|||
case R_X86_64_GOTTPOFF:
|
||||
return R_GOT_PC;
|
||||
case R_X86_64_NONE:
|
||||
return R_HINT;
|
||||
return R_NONE;
|
||||
default:
|
||||
error(toString(S.File) + ": unknown relocation type: " + toString(Type));
|
||||
return R_HINT;
|
||||
|
|
@ -1715,7 +1715,7 @@ RelExpr ARMTargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
|
|||
case R_ARM_THM_MOVT_PREL:
|
||||
return R_PC;
|
||||
case R_ARM_NONE:
|
||||
return R_HINT;
|
||||
return R_NONE;
|
||||
case R_ARM_TLS_LE32:
|
||||
return R_TLS;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,6 @@
|
|||
.section .text.foo,"axG",@progbits,foo,comdat,unique,0
|
||||
foo:
|
||||
nop
|
||||
|
||||
.section .debug_info
|
||||
.long .text.foo
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
# REQUIRES: x86
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %S/Inputs/relocatable-non-alloc.s -o %t2.o
|
||||
# RUN: ld.lld %t2.o %t2.o -r -o %t3.o
|
||||
# RUN: ld.lld %t1.o %t3.o -o %t.o | FileCheck -allow-empty %s
|
||||
|
||||
# CHECK-NOT: has non-ABS reloc
|
||||
|
||||
.globl _start
|
||||
_start:
|
||||
Loading…
Reference in New Issue