[lld] r250463 - ELF2: Do not treat .strtab specially when creating sections.
Rafael EspĂndola via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 16 07:37:56 PDT 2015
Hi,
This and previous patches add more walks over all the output sections.
A normal file normally has less than 100 output sections, so this is
not normally a problem, but it is possible to craft a file with an
arbitrary large number of output sections. I am not sure if we care
about it or not. I just wanted to make sure you know about the
possibility.
Cheers,
Rafael
On 15 October 2015 at 17:50, Rui Ueyama via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: ruiu
> Date: Thu Oct 15 16:50:30 2015
> New Revision: 250463
>
> URL: http://llvm.org/viewvc/llvm-project?rev=250463&view=rev
> Log:
> ELF2: Do not treat .strtab specially when creating sections.
>
> String table is added to end of the file so that all the other sections
> are finalized before string table. But we can just add section names to
> the string table before calling finalize() on any section instead.
>
> Modified:
> lld/trunk/ELF/Writer.cpp
>
> Modified: lld/trunk/ELF/Writer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=250463&r1=250462&r2=250463&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Writer.cpp (original)
> +++ lld/trunk/ELF/Writer.cpp Thu Oct 15 16:50:30 2015
> @@ -470,7 +470,10 @@ template <class ELFT> void Writer<ELFT>:
> }
> addCommonSymbols(CommonSymbols);
>
> + // This order is not the same as the final output order
> + // because we sort the sections using their attributes below.
> OutputSections.push_back(Out<ELFT>::SymTab);
> + OutputSections.push_back(Out<ELFT>::StrTab);
> if (isOutputDynamic()) {
> OutputSections.push_back(Out<ELFT>::DynSymTab);
> OutputSections.push_back(Out<ELFT>::HashTab);
> @@ -487,21 +490,19 @@ template <class ELFT> void Writer<ELFT>:
> std::stable_sort(OutputSections.begin(), OutputSections.end(),
> compareOutputSections<ELFT>);
>
> - // Always put StrTabSec last so that no section names are added to it after
> - // it's finalized.
> - OutputSections.push_back(Out<ELFT>::StrTab);
> -
> for (unsigned I = 0, N = OutputSections.size(); I < N; ++I)
> OutputSections[I]->SectionIndex = I + 1;
>
> - // Fill the DynStrTab early.
> + for (OutputSectionBase<ELFT::Is64Bits> *Sec : OutputSections)
> + Out<ELFT>::StrTab->add(Sec->getName());
> +
> + // Fill the DynStrTab early because Dynamic adds strings to
> + // DynStrTab but .dynstr may appear before .dynamic.
> Out<ELFT>::Dynamic->finalize();
>
> - // Fix each section's header (e.g. sh_size, sh_link, etc.)
> - for (OutputSectionBase<ELFT::Is64Bits> *Sec : OutputSections) {
> - Out<ELFT>::StrTab->add(Sec->getName());
> + // Fill other section headers.
> + for (OutputSectionBase<ELFT::Is64Bits> *Sec : OutputSections)
> Sec->finalize();
> - }
>
> // If we have a .opd section (used under PPC64 for function descriptors),
> // store a pointer to it here so that we can use it later when processing
>
>
> _______________________________________________
> 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