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

David Blaikie dblaikie at gmail.com
Tue May 26 14:08:29 PDT 2015


On Sun, May 24, 2015 at 9:19 AM, Simon Atanasyan <simon at atanasyan.com>
wrote:

> 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


Should we fix yaml2obj?


> 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]]
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150526/b6e4bf11/attachment.html>


More information about the llvm-commits mailing list