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