[PATCH] bfd: Fix Solaris/x86 ELF_MAXPAGESIZE

Jan Beulich jbeulich@suse.com
Mon Aug 18 15:40:45 GMT 2025


On 18.08.2025 16:39, Rainer Orth wrote:
> Hi Jan,
> 
>> On 15.08.2025 14:45, Rainer Orth wrote:
>>> I noticed that the alignment of the .text and .data sections on
>>> Solaris/x86 doesn't match what /bin/ld does: gld uses the original i386
>>> psABI default of 0x1000, while Solaris has moved to larger values as can
>>> be seen both in the Oracle Solaris 11.4 Linkers and Libraries Guide,
>>> ch. 15, Program Loading and Dynamic Linking, p. 15-6 and the system
>>> headers (<sys/elf_{i386,amd64}.h>) that have
>>>
>>> #define	ELF_386_MAXPGSZ		0x10000
>>> #define	ELF_AMD64_MAXPGSZ	0x100000	/* maximum page size */
>>>
>>> while the Solaris/SPARC values are already correct.
>>>
>>> #define	ELF_SPARC_MAXPGSZ	0x10000		/* maximum page size */
>>> #define	ELF_SPARCV9_MAXPGSZ	0x100000
>>>
>>> This patch fixes that.  While on i386 it's sufficient to redefine
>>> ELF_MAXPAGESIZE, x86_64 uses ELF_P_ALIGN instead.
>>
>> I don't quite follow this last sentence. ELF_P_ALIGN is used solely to set
>> the p_align field in struct elf_backend_data. It's okay if that's what is
>> needed for Solaris, but then the wording is a little odd and it remains
>> unclear why i386 would be different in this regard.
> 
> the current patch was developped purely empirically, derived from the
> observation that, unlike i386, just changing ELF_MAXPAGESIZE had no
> effect on Solaris/amd64 p_align.
> 
> Comparing the gcc -g3 -E outputs between i386 and x86_64 (and the
> ELF_P_ALIGN part of the current patch removed), I find what's going on
> (using *_bed as markers):
> 
> * elf32-i386.c:
> 
> #define ELF_P_ALIGN ELF_MINPAGESIZE
> #define ELF_MAXPAGESIZE 0x1000
> #define elf32_bed elf32_i386_bed
> #define ELF_COMMONPAGESIZE ELF_MAXPAGESIZE
> #define ELF_MINPAGESIZE ELF_COMMONPAGESIZE
> #undef ELF_MAXPAGESIZE
> #define ELF_MAXPAGESIZE 0x10000
> #undef elf32_bed
> #define elf32_bed elf32_i386_sol2_bed
> 
>   When ELF_P_ALIGN is used to initialize elf32_i386_sol2_bed, you get
>   the new/correct ELF_MAXPAGESIZE value as desired.
> 
> elf64-x86-64.c:
> 
> #define ELF_P_ALIGN ELF_MINPAGESIZE
> #define ELF_MAXPAGESIZE 0x1000
> #define ELF_COMMONPAGESIZE 0x1000
> #undef elf64_bed
> #define elf64_bed elf64_x86_64_bed
> #define ELF_MINPAGESIZE ELF_COMMONPAGESIZE
> #undef ELF_MAXPAGESIZE
> #define ELF_MAXPAGESIZE 0x100000
> #undef elf64_bed
> #define elf64_bed elf64_x86_64_sol2_bed
> 
>   However, here ELF_COMMONPAGESIZE is defined as 0x1000 (the default
>   value of ELF_MAXPAGESIZE), so redefining ELF_MAXPAGESIZE has no effect
>   on p_align as observed.
> 
> The simplest way to fix this seems to be to omit the ELF_P_ALIGN
> redefinition part in elf64-x86-64.c from the current patch, instead
> using the same
> 
> #define ELF_COMMONPAGESIZE ELF_MAXPAGESIZE
> 
> as in elf32-i386.c instead.  This brings both targets in line, is a
> no-op on non-Solaris x86_64 targets, and has the desired effect on
> Solaris/amd64 p_align.

That reads like the way to go, yes.

Jan


More information about the Binutils mailing list