PR9352: Always emit a relocation for weak symbols. Not emitting relocations

for calls to weak symbols with a definition has the appearance of working
with LLVM-generated code because weak symbol definitions are put in their
own sections.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126933 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eli Friedman 2011-03-03 07:24:36 +00:00
parent 1473f35c47
commit 78c1e1781c
2 changed files with 34 additions and 0 deletions

View File

@ -317,6 +317,13 @@ namespace {
MCDataFragment *F,
const MCSectionData *SD);
virtual bool
IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
const MCSymbolData &DataA,
const MCFragment &FB,
bool InSet,
bool IsPCRel) const;
virtual void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout);
virtual void WriteSection(MCAssembler &Asm,
const SectionIndexMapTy &SectionIndexMap,
@ -1438,6 +1445,18 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm,
}
}
bool
ELFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
const MCSymbolData &DataA,
const MCFragment &FB,
bool InSet,
bool IsPCRel) const {
if (DataA.getFlags() & ELF_STB_Weak)
return false;
return MCObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(
Asm, DataA, FB,InSet, IsPCRel);
}
MCObjectWriter *llvm::createELFObjectWriter(MCELFObjectTargetWriter *MOTW,
raw_ostream &OS,
bool IsLittleEndian) {

View File

@ -0,0 +1,15 @@
// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump | FileCheck %s
// Test that weak symbols always produce relocations
.weak foo
foo:
bar:
call foo
//CHECK: # Relocation 0x00000000
//CHECK-NEXT: (('r_offset', 0x00000001)
//CHECK-NEXT: ('r_sym', 0x00000005)
//CHECK-NEXT: ('r_type', 0x00000002)
//CHECK-NEXT: ('r_addend', 0xfffffffc)
//CHECK-NEXT: ),