[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