Revert "Relax the restriction on what relocations can be in a non-alloc section."

This reverts commit r295102.

In the link of seabios the assumption seems to be that the section has
an actual address, so this is not sufficient. Changing the assembly
code to add a "a" flag seems like the correct thing to do instead of
extending this hack.

Sorry about the noise.

Original message:

    Relax the restriction on what relocations can be in a non-alloc section.

    The main thing that they can't have is relocations that require the
    creation of gots or plt.  For now also accept R_PC.

    Found while linking seabios.

llvm-svn: 295130
This commit is contained in:
Rafael Espindola 2017-02-15 00:27:47 +00:00
parent 1b36eeaafa
commit a8541675e0
2 changed files with 2 additions and 21 deletions

View File

@ -452,8 +452,7 @@ void InputSection<ELFT>::relocateNonAlloc(uint8_t *Buf, ArrayRef<RelTy> Rels) {
Addend += Target->getImplicitAddend(BufLoc, Type); Addend += Target->getImplicitAddend(BufLoc, Type);
SymbolBody &Sym = this->File->getRelocTargetSym(Rel); SymbolBody &Sym = this->File->getRelocTargetSym(Rel);
RelExpr E = Target->getRelExpr(Type, Sym); if (Target->getRelExpr(Type, Sym) != R_ABS) {
if (E != R_ABS && E != R_PC) {
error(this->getLocation(Offset) + ": has non-ABS reloc"); error(this->getLocation(Offset) + ": has non-ABS reloc");
return; return;
} }
@ -462,7 +461,7 @@ void InputSection<ELFT>::relocateNonAlloc(uint8_t *Buf, ArrayRef<RelTy> Rels) {
uint64_t SymVA = 0; uint64_t SymVA = 0;
if (!Sym.isTls() || Out<ELFT>::TlsPhdr) if (!Sym.isTls() || Out<ELFT>::TlsPhdr)
SymVA = SignExtend64<sizeof(uintX_t) * 8>( SymVA = SignExtend64<sizeof(uintX_t) * 8>(
getRelocTargetVA<ELFT>(Type, Addend, AddrLoc, Sym, E)); getRelocTargetVA<ELFT>(Type, Addend, AddrLoc, Sym, R_ABS));
Target->relocateOne(BufLoc, Type, SymVA); Target->relocateOne(BufLoc, Type, SymVA);
} }
} }

View File

@ -1,18 +0,0 @@
// REQUIRES: x86
// RUN: llvm-mc -filetype=obj -triple=i386-pc-linux %s -o %t.o
// RUN: ld.lld -shared %t.o -o %t.so
// RUN: llvm-objdump -s %t.so | FileCheck %s
// CHECK: Contents of section .text:
// CHECK-NEXT: 1000 00000000 00000000
// CHECK: Contents of section .bar:
// CHECK-NEXT: 0000 00100000 fc0f0000
foo:
.quad 0
.section .bar
.long foo - .
.long foo - .