[lld] r238115 - [ELF] Fix lld when no unique sections is used

Simon Atanasyan simon at atanasyan.com
Sun May 24 09:19:27 PDT 2015


Author: atanasyan
Date: Sun May 24 11:19:27 2015
New Revision: 238115

URL: http://llvm.org/viewvc/llvm-project?rev=238115&view=rev
Log:
[ELF] Fix lld when no unique sections is used

Original patch of Shankar Easwaran with additional test case.
The yaml2obj does not allow to create an object file with non-unique
sections names so the fix uses a binary input object file in the test
case.

Added:
    lld/trunk/test/elf/Inputs/no-unique-section-names.x86-64
    lld/trunk/test/elf/no-unique-section-names.test
Modified:
    lld/trunk/lib/ReaderWriter/ELF/ELFFile.cpp
    lld/trunk/lib/ReaderWriter/ELF/ELFFile.h

Modified: lld/trunk/lib/ReaderWriter/ELF/ELFFile.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFFile.cpp?rev=238115&r1=238114&r2=238115&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ELFFile.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ELFFile.cpp Sun May 24 11:19:27 2015
@@ -143,7 +143,7 @@ std::error_code ELFFile<ELFT>::createAto
       auto rai(_objFile->begin_rela(&section));
       auto rae(_objFile->end_rela(&section));
 
-      _relocationAddendReferences[*sectionName] = make_range(rai, rae);
+      _relocationAddendReferences[sHdr] = make_range(rai, rae);
       totalRelocs += std::distance(rai, rae);
     } else if (section.sh_type == llvm::ELF::SHT_REL) {
       auto sHdr = _objFile->getSection(section.sh_info);
@@ -155,7 +155,7 @@ std::error_code ELFFile<ELFT>::createAto
       auto ri(_objFile->begin_rel(&section));
       auto re(_objFile->end_rel(&section));
 
-      _relocationReferences[*sectionName] = make_range(ri, re);
+      _relocationReferences[sHdr] = make_range(ri, re);
       totalRelocs += std::distance(ri, re);
     } else {
       _sectionSymbols[&section];
@@ -554,12 +554,12 @@ ELFDefinedAtom<ELFT> *ELFFile<ELFT>::cre
   unsigned int referenceStart = _references.size();
 
   // Add Rela (those with r_addend) references:
-  auto rari = _relocationAddendReferences.find(sectionName);
+  auto rari = _relocationAddendReferences.find(section);
   if (rari != _relocationAddendReferences.end())
     createRelocationReferences(symbol, symContent, rari->second);
 
   // Add Rel references.
-  auto rri = _relocationReferences.find(sectionName);
+  auto rri = _relocationReferences.find(section);
   if (rri != _relocationReferences.end())
     createRelocationReferences(symbol, symContent, secContent, rri->second);
 

Modified: lld/trunk/lib/ReaderWriter/ELF/ELFFile.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFFile.h?rev=238115&r1=238114&r2=238115&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ELFFile.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ELFFile.h Sun May 24 11:19:27 2015
@@ -345,10 +345,10 @@ protected:
   /// list of relocations references.  In ELF, if a section named, ".text" has
   /// relocations will also have a section named ".rel.text" or ".rela.text"
   /// which will hold the entries.
-  std::unordered_map<StringRef, range<Elf_Rela_Iter>>
+  std::unordered_map<const Elf_Shdr *, range<Elf_Rela_Iter>>
   _relocationAddendReferences;
   MergedSectionMapT _mergedSectionMap;
-  std::unordered_map<StringRef, range<Elf_Rel_Iter>> _relocationReferences;
+  std::unordered_map<const Elf_Shdr *, range<Elf_Rel_Iter>> _relocationReferences;
   std::vector<ELFReference<ELFT> *> _references;
   llvm::DenseMap<const Elf_Sym *, Atom *> _symbolToAtomMapping;
   llvm::DenseMap<const ELFReference<ELFT> *, const Elf_Sym *>

Added: lld/trunk/test/elf/Inputs/no-unique-section-names.x86-64
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Inputs/no-unique-section-names.x86-64?rev=238115&view=auto
==============================================================================
Binary files lld/trunk/test/elf/Inputs/no-unique-section-names.x86-64 (added) and lld/trunk/test/elf/Inputs/no-unique-section-names.x86-64 Sun May 24 11:19:27 2015 differ

Added: lld/trunk/test/elf/no-unique-section-names.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/no-unique-section-names.test?rev=238115&view=auto
==============================================================================
--- lld/trunk/test/elf/no-unique-section-names.test (added)
+++ lld/trunk/test/elf/no-unique-section-names.test Sun May 24 11:19:27 2015
@@ -0,0 +1,19 @@
+# Check handling object files with non-unique named sections.
+
+RUN: lld -flavor gnu -target x86_64-linux -shared -o %t \
+RUN:     %p/Inputs/no-unique-section-names.x86-64 
+RUN: llvm-objdump -s %p/Inputs/no-unique-section-names.x86-64 %t \
+RUN:   | FileCheck %s
+
+CHECK:      Contents of section .group:
+CHECK-NEXT:  0000 01000000 08000000
+CHECK-NEXT: Contents of section .text:
+CHECK-NEXT:  0000 [[A1:[0-9a-f]+]] [[A2:[0-9a-f]+]] [[A3:[0-9a-f]+]]
+CHECK-NEXT: Contents of section .group:
+CHECK-NEXT:  0000 01000000 0a000000
+CHECK-NEXT: Contents of section .text:
+CHECK-NEXT:  0000 [[B1:[0-9a-f]+]] [[B2:[0-9a-f]+]] [[B3:[0-9a-f]+]]
+
+CHECK:      Contents of section .text:
+CHECK:       {{[0-9a-f]+}} [[A1]] [[A2]] [[A3]]
+CHECK-NEXT:  {{[0-9a-f]+}} [[B1]] [[B2]] [[B3]]





More information about the llvm-commits mailing list