[lld] r251789 - [ELF2] Ensure that .dynsym section is finalized before .gnu.hash.

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 2 06:33:29 PST 2015


Thanks!

On 2 November 2015 at 05:46, Igor Kudrin via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: ikudrin
> Date: Mon Nov  2 04:46:14 2015
> New Revision: 251789
>
> URL: http://llvm.org/viewvc/llvm-project?rev=251789&view=rev
> Log:
> [ELF2] Ensure that .dynsym section is finalized before .gnu.hash.
>
> It is required to fill up the GNU hash table section before its
> finalize() method is called.
>
> Differential Revision: http://reviews.llvm.org/D14196
>
> Modified:
>     lld/trunk/ELF/OutputSections.cpp
>     lld/trunk/ELF/Writer.cpp
>
> Modified: lld/trunk/ELF/OutputSections.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=251789&r1=251788&r2=251789&view=diff
> ==============================================================================
> --- lld/trunk/ELF/OutputSections.cpp (original)
> +++ lld/trunk/ELF/OutputSections.cpp Mon Nov  2 04:46:14 2015
> @@ -340,8 +340,7 @@ unsigned GnuHashTableSection<ELFT>::calc
>  }
>
>  template <class ELFT> void GnuHashTableSection<ELFT>::finalize() {
> -  ArrayRef<SymbolBody *> A = Out<ELFT>::DynSymTab->getSymbols();
> -  unsigned NumHashed = std::count_if(A.begin(), A.end(), includeInGnuHashTable);
> +  unsigned NumHashed = HashedSymbols.size();
>    NBuckets = calcNBuckets(NumHashed);
>    MaskWords = calcMaskWords(NumHashed);
>    // Second hash shift estimation: just predefined values.
> @@ -900,6 +899,9 @@ SymbolTableSection<ELFT>::SymbolTableSec
>  }
>
>  template <class ELFT> void SymbolTableSection<ELFT>::finalize() {
> +  if (this->Header.sh_size)
> +    return; // Already finalized.
> +
>    this->Header.sh_size = getNumSymbols() * sizeof(Elf_Sym);
>    this->Header.sh_link = StrTabSec.SectionIndex;
>    this->Header.sh_info = NumLocals + 1;
>
> Modified: lld/trunk/ELF/Writer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=251789&r1=251788&r2=251789&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Writer.cpp (original)
> +++ lld/trunk/ELF/Writer.cpp Mon Nov  2 04:46:14 2015
> @@ -581,9 +581,13 @@ template <class ELFT> void Writer<ELFT>:
>    for (OutputSectionBase<ELFT> *Sec : OutputSections)
>      Out<ELFT>::ShStrTab->add(Sec->getName());
>
> -  // Fill the DynStrTab early because Dynamic adds strings to
> -  // DynStrTab but .dynstr may appear before .dynamic.
> +  // Finalizers fix each section's size.
> +  // .dynamic section's finalizer may add strings to .dynstr,
> +  // so finalize that early.
> +  // Likewise, .dynsym is finalized early since that may fill up .gnu.hash.
>    Out<ELFT>::Dynamic->finalize();
> +  if (isOutputDynamic())
> +    Out<ELFT>::DynSymTab->finalize();
>
>    // Fill other section headers.
>    for (OutputSectionBase<ELFT> *Sec : OutputSections)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list