PR9352: Always emit a relocation for weak symbols. Not emitting relocations
authorEli Friedman <eli.friedman@gmail.com>
Thu, 3 Mar 2011 07:24:36 +0000 (07:24 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Thu, 3 Mar 2011 07:24:36 +0000 (07:24 +0000)
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

lib/MC/ELFObjectWriter.cpp
test/MC/ELF/weak-relocation.s [new file with mode: 0644]

index 77017fb4d936133057c102ba356f1aea5ae1cc28..7488b1b6c2a634959b94c1a31d07f20cc3d41fd6 100644 (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) {
diff --git a/test/MC/ELF/weak-relocation.s b/test/MC/ELF/weak-relocation.s
new file mode 100644 (file)
index 0000000..ef331d7
--- /dev/null
@@ -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:   ),