[PATCH] elf: Set p_align to the common page size if possible

Florian Weimer fweimer@redhat.com
Mon Dec 20 18:51:17 GMT 2021


* H. J. Lu:

> We need to set larger p_align > sh_addralign for huge page executables.
> My current algorithm to decide if p_align should be used as the maximum
> page size for objcopy is
>
> static bool
> elf_is_p_align_valid (bfd *abfd)
> {
>   unsigned int i;
>   Elf_Internal_Phdr *segment;
>   unsigned int num_segments;
>   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
>   bfd_size_type maxpagesize = bed->maxpagesize;
>   bfd_size_type commonpagesize = bed->commonpagesize;
>
>   if (commonpagesize == maxpagesize)
>     return true;
>
>   /* When the common page size != the maximum page size, p_align may
>      be set to the common page size while segments are aligned to
>      the maximum page size.  In this case, the input p_align will be
>      ignored and the maximum page size will be used to align the output
>      segments.  */
>   segment = elf_tdata (abfd)->phdr;
>   num_segments = elf_elfheader (abfd)->e_phnum;
>   for (i = 0; i < num_segments; i++, segment++)
>     if (segment->p_type == PT_LOAD
>         && (segment->p_align != commonpagesize
>             || vma_page_aligned_bias (segment->p_vaddr,
>                                       segment->p_offset,
>                                       maxpagesize) != 0))
>       return true;
>
>   return false;
> }
>
> It should cover all cases.

Will this switch from 64K to 4K on POWER and AArch64?  I think this will
then produce binaries which cannot be loaded by current glibc in all
cases:

  PT_LOAD p_align check is too strict
  <https://sourceware.org/bugzilla/show_bug.cgi?id=28688>

Thanks,
Florian



More information about the Binutils mailing list