[PATCH] x86-64: Increase output copy relocation section alignment
H.J. Lu
hjl.tools@gmail.com
Mon Feb 17 14:19:00 GMT 2025
On Mon, Feb 17, 2025 at 9:01 PM Alan Modra <amodra@gmail.com> wrote:
>
> On Mon, Feb 17, 2025 at 06:14:29PM +0800, H.J. Lu wrote:
> > PR ld/32690
> > * elfxx-x86.c (_bfd_x86_elf_adjust_dynamic_symbol): Adjust the
> > output copy relocation section alignment if needed.
>
> This is a tricky situation, isn't it? Good job tracking down exactly
I will try to create a testcase.
> what was happening! The alignment would propagate to the output
> section on the next sizing pass, but that's too late for the relro
> code on the current pass.
>
> > --- a/bfd/elfxx-x86.c
> > +++ b/bfd/elfxx-x86.c
> > @@ -3390,6 +3390,7 @@ _bfd_x86_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
> > struct elf_dyn_relocs *p;
> > const struct elf_backend_data *bed
> > = get_elf_backend_data (info->output_bfd);
> > + bool ret;
> >
> > eh = (struct elf_x86_link_hash_entry *) h;
> >
> > @@ -3608,7 +3609,23 @@ _bfd_x86_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
> > h->needs_copy = 1;
> > }
> >
> > - return _bfd_elf_adjust_dynamic_copy (info, h, s);
> > + ret = _bfd_elf_adjust_dynamic_copy (info, h, s);
> > + if (bed->target_id == X86_64_ELF_DATA)
>
> Why just for x86_64?
I only have a test for x86_64.
>
> > + {
> > + /* NB: Increase the output copy relocation section alignment so
> > + that relro base and end values are properly computed. */
> > + asection *output_sec
> > + = bfd_get_linker_section (info->output_bfd, s->name);
>
> Also, can't you use output_sec = s->output_section here?
For x86_64, s->output_section is NULL since one_lang_size_sections_pass
is run before allocation.
> > + if (output_sec)
> > + {
> > + unsigned int power_of_two = bfd_section_alignment (s);
> > + /* Adjust the section alignment if needed. */
> > + if (power_of_two > bfd_section_alignment (output_sec)
> > + && !bfd_set_section_alignment (output_sec, power_of_two))
> > + return false;
> > + }
> > + }
> > + return ret;
> > }
> >
> > void
>
> In fact, can't you bump the output section alignment in
> _bfd_elf_adjust_dynamic_copy for all targets?
>
> diff --git a/bfd/elflink.c b/bfd/elflink.c
> index c9468ff42ac..61750e325c5 100644
> --- a/bfd/elflink.c
> +++ b/bfd/elflink.c
> @@ -3389,6 +3389,14 @@ _bfd_elf_adjust_dynamic_copy (struct bfd_link_info *info,
> /* Adjust the section alignment if needed. */
> if (!bfd_set_section_alignment (dynbss, power_of_two))
> return false;
> + /* Adjust output section alignment too, so that layout adjusts
> + for alignment on the current lang_size_sections pass. This
> + is important for lang_size_relro_segment which will use the
> + input section alignment. */
> + asection *osec = dynbss->output_section;
This won't work for x86-64 for the reason I mentioned above.
> + if (osec && power_of_two > bfd_section_alignment (osec)
> + && !bfd_set_section_alignment (osec, power_of_two))
> + return false;
> }
>
> /* We make sure that the symbol will be aligned properly. */
>
>
> --
> Alan Modra
--
H.J.
More information about the Binutils
mailing list