[PATCH] gold: Place .note.gnu.property section before other note sections
H.J. Lu
hjl.tools@gmail.com
Mon Oct 25 22:28:55 GMT 2021
On Mon, Oct 25, 2021 at 1:53 PM Fangrui Song <i@maskray.me> wrote:
>
> On Mon, Oct 25, 2021 at 8:51 AM H.J. Lu via Binutils
> <binutils@sourceware.org> wrote:
> >
> > Place the .note.gnu.property section before all other note sections to
> > avoid being placed between other note sections with different alignments.
> >
> > PR gold/28494
> > * layout.cc (Layout::create_note): Set order to ORDER_PROPERTY_NOTE
> > for the .note.gnu.property section.
> > * layout.h (Output_section_order): Add ORDER_PROPERTY_NOTE.
> > ---
> > gold/layout.cc | 3 ++-
> > gold/layout.h | 9 +++++++--
> > 2 files changed, 9 insertions(+), 3 deletions(-)
>
> I think the order should be agnostic. The linker should just apply
> usual heuristics: output sections are ordered by first-seen member
> input section.
Gold orders output sections with by Output_section_order:
// Add an Output_section to a PT_LOAD Output_segment.
void
Output_segment::add_output_section_to_load(Layout* layout,
Output_section* os,
elfcpp::Elf_Word seg_flags)
{
gold_assert(this->type() == elfcpp::PT_LOAD);
gold_assert((os->flags() & elfcpp::SHF_ALLOC) != 0);
gold_assert(!this->is_max_align_known_);
gold_assert(os->is_large_data_section() == this->is_large_data_segment());
this->update_flags_for_output_section(seg_flags);
// We don't want to change the ordering if we have a linker script
// with a SECTIONS clause.
Output_section_order order = os->order();
if (layout->script_options()->saw_sections_clause())
order = static_cast<Output_section_order>(0);
else
gold_assert(order != ORDER_INVALID);
this->output_lists_[order].push_back(os);
}
Add ORDER_PROPERTY_NOTE is the simplest way to deal
with it.
> Then I use this strategy for LLD: SHT_NOTE sections with different
> alignments belong to different PT_NOTE.
> https://reviews.llvm.org/D61296
>
>
> > diff --git a/gold/layout.cc b/gold/layout.cc
> > index a27cb071c75..38e9bceec7e 100644
> > --- a/gold/layout.cc
> > +++ b/gold/layout.cc
> > @@ -3245,7 +3245,8 @@ Layout::create_note(const char* name, int note_type,
> > if (allocate)
> > {
> > flags = elfcpp::SHF_ALLOC;
> > - order = ORDER_RO_NOTE;
> > + order = (note_type == elfcpp::NT_GNU_PROPERTY_TYPE_0
> > + ? ORDER_PROPERTY_NOTE : ORDER_RO_NOTE);
> > }
> > Output_section* os = this->choose_output_section(NULL, section_name,
> > elfcpp::SHT_NOTE,
> > diff --git a/gold/layout.h b/gold/layout.h
> > index 0b378003679..05c31714e47 100644
> > --- a/gold/layout.h
> > +++ b/gold/layout.h
> > @@ -399,8 +399,13 @@ enum Output_section_order
> > // linker can pick it up quickly.
> > ORDER_INTERP,
> >
> > - // Loadable read-only note sections come next so that the PT_NOTE
> > - // segment is on the first page of the executable.
> > + // The .note.gnu.property section comes next so that the PT_NOTE
> > + // segment is on the first page of the executable and it won't be
> > + // placed between other note sections with different alignments.
> > + ORDER_PROPERTY_NOTE,
> > +
> > + // Loadable read-only note sections come after the .note.gnu.property
> > + // section.
> > ORDER_RO_NOTE,
> >
> > // Put read-only sections used by the dynamic linker early in the
> > --
> > 2.32.0
> >
--
H.J.
More information about the Binutils
mailing list