[PATCH] D16899: Don't push relocation sections onto InputSection<ELFT>::Discarded.RelocSections

Sean Silva via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 4 13:30:19 PST 2016


silvas created this revision.
silvas added reviewers: ruiu, rafael.
silvas added subscribers: Bigcheese, llvm-commits.

LLVM3.3 (and earlier) would fail to include a relocation section in
the group that the section it was relocating is in. Object files
affected by this issue have been encountered in the wild when using LLD.

This would result in a siutation like:

  Section {
    Index: 5
    Name: .text._Z3fooIiEvv (6)
    Type: SHT_PROGBITS (0x1)
    Flags [ (0x206)
      SHF_ALLOC (0x2)
      SHF_EXECINSTR (0x4)
      SHF_GROUP (0x200)
    ]
    Address: 0x0
    Offset: 0x48
    Size: 5
    Link: 0
    Info: 0
    AddressAlignment: 1
    EntrySize: 0
  }
  Section {
    Index: 6
    Name: .rela.text._Z3fooIiEvv (1)
    Type: SHT_RELA (0x4)
    Flags [ (0x0)
    ]
    Address: 0x0
    Offset: 0x3F0
    Size: 24
    Link: 8
    Info: 5
    AddressAlignment: 8
    EntrySize: 24
  }

In LLD, during symbol resolution, we discard the section containing the
weak symbol, but this amounts to replacing it with
InputSection<ELFT>::Discarded.
When we later saw the corresponding relocation section, we would then
end up pusing onto InputSection<ELFT>::Discarded.RelocSections, which is
bogus.

http://reviews.llvm.org/D16899

Files:
  ELF/InputFiles.cpp
  test/ELF/Inputs/llvm33-rela-outside-group.o
  test/ELF/llvm33-rela-outside-group.s

Index: test/ELF/llvm33-rela-outside-group.s
===================================================================
--- /dev/null
+++ test/ELF/llvm33-rela-outside-group.s
@@ -0,0 +1,11 @@
+// Input file generated with:
+// llvm33/llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %S/Inputs/llvm33-rela-outside-group.o
+//
+// RUN: ld.lld -shared %S/Inputs/llvm33-rela-outside-group.o %S/Inputs/llvm33-rela-outside-group.o
+
+	.global bar
+	.weak	_Z3fooIiEvv
+
+	.section	.text._Z3fooIiEvv,"axG", at progbits,_Z3fooIiEvv,comdat
+_Z3fooIiEvv:
+	callq	bar
Index: ELF/InputFiles.cpp
===================================================================
--- ELF/InputFiles.cpp
+++ ELF/InputFiles.cpp
@@ -214,6 +214,8 @@
         fatal("Invalid relocated section index");
       InputSectionBase<ELFT> *RelocatedSection =
           Sections[RelocatedSectionIndex];
+      if (RelocatedSection == &InputSection<ELFT>::Discarded)
+        continue;
       if (!RelocatedSection)
         fatal("Unsupported relocation reference");
       if (auto *S = dyn_cast<InputSection<ELFT>>(RelocatedSection)) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16899.46956.patch
Type: text/x-patch
Size: 1093 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160204/4bdf2ee2/attachment.bin>


More information about the llvm-commits mailing list