On Thu, Jul 1, 2021 at 6:44 PM Eric Botcazou <botca...@adacore.com> wrote:
>
> Hi,
>
> a big difference between ELF and PE-COFF is that, with the latter, you can
> build position-independent executables or DLLs without generating PIC; as a
> matter of fact, flag_pic has historically been forced to 0 for 32-bit:
>
> /* Don't allow flag_pic to propagate since gas may produce invalid code
>    otherwise.  */
>
> #undef  SUBTARGET_OVERRIDE_OPTIONS
> #define SUBTARGET_OVERRIDE_OPTIONS
> \
> do {
>         \
>   flag_pic = TARGET_64BIT ? 1 : 0;                                      \
> } while (0)
>
> The reason is that the linker builds a .reloc section that collects all the
> absolute relocations in the generated binary, and the loader uses them to
> relocate it at load time if need be (e.g. if --dynamicbase is enabled).
>
> Up to binutils 2.35, the GNU linker didn't build the .reloc section for
> executables and defaulted to --enable-auto-image-base for DLLs, which means
> that DLLs had an essentially unique load address and, therefore, need not be
> relocated by the loader in most cases.
>
> With binutils 2.36 and later, the GNU linker builds a .reloc section for
> executables (thus making them PIE), --enable-auto-image-base is disabled and
> --dynamicbase is enabled by default, which means that essentially all the
> binaries are relocated at load time.
>
> This badly breaks the 32-bit compiler configured to use DWARF-2 EH (the 64-bit
> compiler always uses the native SEH) because the loader corrupts the .eh_frame
> section when processing the relocations contained in the .reloc section.
>
> The attached patch simply forces the PIC encodings for EH on PE-COFF targets.
>
> Tested on x86/Windows, OK for all active branches?

OK.

Richard.

>
> 2021-07-01  Eric Botcazou  <ebotca...@adacore.com>
>
>         * config/i386/i386.c (asm_preferred_eh_data_format): Always use the
>         PIC encodings for PE-COFF targets.
>
> --
> Eric Botcazou

Reply via email to