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

Florian Weimer fweimer@redhat.com
Mon Dec 20 16:36:25 GMT 2021


* Fangrui Song:

> On 2021-12-15, H.J. Lu via Binutils wrote:
>>Currently, on 32-bit and 64-bit ARM, it seems that ld generates p_align
>>values of 0x10000 even if no section alignment is greater than 0x1000.
>>The issue is more general and probably affects other targets with
>>multiple common page sizes.
>>
>>While file layout absolutely must take 64K page size into account, that
>>does not have to be reflected in the p_align value.  If running on a 64K
>>kernel, the file will be loaded at a 64K page boundary by necessity. On
>>a 4K kernel, 64K alignment is not needed.
>>
>>The glibc loader has been fixed to honor p_align:
>
> Maybe it's just me who is very careful on the words: aligning to p_align
> is a new feature, not a bug, as no ABI requires it. No ld.so I know
> (FreeBSD, musl, bionic) does this.

The expectation seems to be fairly clear that p_align should reflect
segment alignment.  It's true that the ELF specification does not
explicitly say that segment alignment of virtual addresses also carries
over to the process image, but that part seems so obvious that it
perhaps wasn't stated explicitly.

Current linkers probably should have used the reserved values 0 and 1 if
they want to convey that alignment does not matter.

>>https://sourceware.org/bugzilla/show_bug.cgi?id=28676
>>
>>similar to kernel:
>>
>>commit ce81bb256a224259ab686742a6284930cbe4f1fa
>>Author: Chris Kennelly <ckennelly@google.com>
>>Date:   Thu Oct 15 20:12:32 2020 -0700
>>
>>    fs/binfmt_elf: use PT_LOAD p_align values for suitable start address
>
> This kernel patch has no cost. It just picks a load bias, while the
> glibc's .so loading patch has some costs because there is no alignment
> parameter to mmap... So now, every
>
> * (Linux x86-64) -z noseparate-code (default max-page-size=2MiB) .so incurs some munmap overhead
> * arm/aarch64/powerpc (default max-page-size=65536) .so incurs some munmap overhead...
>
> If I were to do this, I would fix objcopy first, then adjust ld's
> p_align, finally tune glibc's .so loading.

Maybe we need to add some markup that the p_align value is actually
real.

Thanks,
Florian



More information about the Binutils mailing list