[PATCH v4] PE/COFF: raise normal PE section limit safely
Alan Modra
amodra@gmail.com
Thu Jul 16 00:54:12 GMT 2026
On Tue, Jul 14, 2026 at 10:23:49PM +0200, Oleg Tolmatcev wrote:
> PE/COFF stores symbol section numbers in a 16-bit field. Binutils used
> signed 16-bit handling there, which limited normal PE objects to 32767
> sections even though MSVC and Clang already accept a larger unsigned
> range.
>
> Raise the normal PE section limit to 65279, while keeping the PE/COFF
> special section-number values for undefined, absolute and debug symbols
> working correctly. Do this by decoding and encoding normal PE symbol
> section numbers as unsigned values in the ordinary range, but preserving
> the reserved PE constants explicitly.
>
> Also add a gas test that exercises a normal PE object above the old
> 32767-section limit and checks that objdump reports the high section
> number correctly.
>
> bfd/ChangeLog:
>
> * coffcode.h (COFF_DEFAULT_MAX_NSCNS): Define.
> (bfd_coff_std_swap_table): Use it for the default maximum section
> count.
> (ticoff0_swap_table): Likewise.
> (ticoff1_swap_table): Likewise.
> * peXXigen.c (pe_decode_sym_section_number): New function.
> (pe_encode_sym_section_number): New function.
> (_bfd_XXi_swap_sym_in): Use pe_decode_sym_section_number.
> (_bfd_XXi_swap_sym_out): Use pe_encode_sym_section_number.
>
> include/ChangeLog:
>
> * coff/pe.h (IMAGE_SYM_UNDEFINED): Define.
> (IMAGE_SYM_ABSOLUTE): Define.
> (IMAGE_SYM_DEBUG): Define.
> (IMAGE_SYM_SECTION_MAX): Define.
>
> gas/ChangeLog:
>
> * testsuite/gas/pe/pe.exp: Run large-obj-normal.
> * testsuite/gas/pe/large-obj-normal.s: New test.
> * testsuite/gas/pe/large-obj-normal.d: New test.
This looks OK to me.
--
Alan Modra
More information about the Binutils
mailing list