[PATCH v4 1/2] bfd: fill in PE load config directory entry.

Jan Beulich jbeulich@suse.com
Wed Apr 2 08:00:51 GMT 2025


On 01.04.2025 22:17, Jeremy Drake wrote:
> On Tue, 1 Apr 2025, Jeremy Drake wrote:
>> I can either: add a remark "If anyone cares about such versions, the size
>> would need to be overridden for them."  Or, if you can point out the
>> proper incantation to identify i386 here I can do that.  I confirmed on
>> Windows 11 that for i386 modules it will accept either 0x40 or the 32-bit
>> value at the VirtualAddress as the Size, while for x86_64 modules it will
>> only accept the 32-bit value at the VirtualAddress.
> 
> This is what I came up with.  I'll wait to send a new patch series to hear
> if that's right, to hopefully avoid yet another 24-hour roundtrip.
> 
> diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
> index 0dec04fcc3e..0b43ed2ee15 100644
> --- a/bfd/peXXigen.c
> +++ b/bfd/peXXigen.c
> @@ -4601,21 +4601,22 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
>               result = false;
>             }
> 
> -         /* The size is stored as the first 4 bytes at _load_config_used.
> -            The Microsoft PE format documentation says for compatibility with
> -            Windows XP and earlier, the size must be 64 for x86 images.  If
> -            anyone cares about those versions, the size should be overridden
> -            for i386.  */
> +         /* The size is stored as the first 4 bytes at _load_config_used.  */
>           if (bfd_get_section_contents (abfd,
>                 h1->root.u.def.section->output_section, data,
>                 h1->root.u.def.section->output_offset + h1->root.u.def.value,
>                 4))
>             {
> +             uint32_t size = bfd_get_32 (abfd, data);
> +             /* The Microsoft PE format documentation says for compatibility
> +                with Windows XP and earlier, the size must be 64 for x86
> +                images.  */
>               pe_data (abfd)->pe_opthdr.DataDirectory[PE_LOAD_CONFIG_TABLE].Size =
> -               bfd_get_32 (abfd, data);
> +               (bfd_get_arch (abfd) == bfd_arch_i386 &&
> +                (bfd_get_mach (abfd) & ~bfd_mach_i386_intel_syntax) ==
> +                 bfd_mach_i386_i386) ? 64 : size;

As per the other reply, I think we're okay to not fiddle with the field,
until someone actually complains (with a good reason to still require
XP compatibility). As said there, just the comment wants to reflect that.

Jan


More information about the Binutils mailing list