[PATCH] ld: revert default dll characteristics for Cygwin.
Corinna Vinschen
vinschen@redhat.com
Tue Oct 19 17:08:30 GMT 2021
Any chance to get this patch into binutils soon?
The default PE flag values generated for Cygwin executables are really a
problem in terms of dynamicbase. We can change that on the compiler
command line, but that's just a workaround.
Thanks,
Corinna
On Mar 1 11:43, Jeremy Drake wrote:
> Mail thread from
> https://cygwin.com/pipermail/cygwin/2021-February/247922.html suggests
> these flags will NOT work for Cygwin, which relies on stable address
> layouts for their fork() emulation.
>
> In the process, renamed move_default_addr_high shell variable to
> cygwin_beahior, as the old name wasn't quite accurate anymore and I
> wanted to use it choose which dll characteristics flags to use by
> default.
>
> Also copied that switch to pe.em, as it was only in pep.em before but
> 32-bit also needed to switch defaults for Cygwin.
> ---
> ld/emultempl/pe.em | 13 ++++++++++++-
> ld/emultempl/pep.em | 40 +++++++++++++++++++++-------------------
> 2 files changed, 33 insertions(+), 20 deletions(-)
>
> diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em
> index 748a6b49412..9f757cc31dc 100644
> --- a/ld/emultempl/pe.em
> +++ b/ld/emultempl/pe.em
> @@ -5,6 +5,16 @@ if [ -z "$MACHINE" ]; then
> else
> OUTPUT_ARCH=${ARCH}:${MACHINE}
> fi
> +
> +case ${target} in
> + *-*-cygwin*)
> + cygwin_behavior=1
> + ;;
> + *)
> + cygwin_behavior=0;
> + ;;
> +esac
> +
> rm -f e${EMULATION_NAME}.c
> (echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
> fragment <<EOF
> @@ -104,7 +114,8 @@ fragment <<EOF
> #define DEFAULT_PSEUDO_RELOC_VERSION 1
> #endif
>
> -#define DEFAULT_DLL_CHARACTERISTICS (IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE \
> +#define DEFAULT_DLL_CHARACTERISTICS (${cygwin_behavior} ? 0 : \
> + IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE \
> | IMAGE_DLL_CHARACTERISTICS_NX_COMPAT)
>
> #if defined(TARGET_IS_i386pe) || ! defined(DLL_SUPPORT)
> diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em
> index ff49c15c002..69f5bd04655 100644
> --- a/ld/emultempl/pep.em
> +++ b/ld/emultempl/pep.em
> @@ -8,10 +8,10 @@ fi
>
> case ${target} in
> *-*-cygwin*)
> - move_default_addr_high=1
> + cygwin_behavior=1
> ;;
> *)
> - move_default_addr_high=0;
> + cygwin_behavior=0;
> ;;
> esac
>
> @@ -99,45 +99,47 @@ fragment <<EOF
> #define DLL_SUPPORT
> #endif
>
> -#define DEFAULT_DLL_CHARACTERISTICS (IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE \
> +#define DEFAULT_DLL_CHARACTERISTICS (${cygwin_behavior} ? 0 : \
> + IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE \
> | IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA \
> | IMAGE_DLL_CHARACTERISTICS_NX_COMPAT)
>
> +
> #if defined(TARGET_IS_i386pep) || ! defined(DLL_SUPPORT)
> #define PE_DEF_SUBSYSTEM 3
> #undef NT_EXE_IMAGE_BASE
> #define NT_EXE_IMAGE_BASE \
> - ((bfd_vma) (${move_default_addr_high} ? 0x100400000LL \
> - : 0x140000000LL))
> + ((bfd_vma) (${cygwin_behavior} ? 0x100400000LL \
> + : 0x140000000LL))
> #undef NT_DLL_IMAGE_BASE
> #define NT_DLL_IMAGE_BASE \
> - ((bfd_vma) (${move_default_addr_high} ? 0x400000000LL \
> - : 0x180000000LL))
> + ((bfd_vma) (${cygwin_behavior} ? 0x400000000LL \
> + : 0x180000000LL))
> #undef NT_DLL_AUTO_IMAGE_BASE
> #define NT_DLL_AUTO_IMAGE_BASE \
> - ((bfd_vma) (${move_default_addr_high} ? 0x400000000LL \
> - : 0x1C0000000LL))
> + ((bfd_vma) (${cygwin_behavior} ? 0x400000000LL \
> + : 0x1C0000000LL))
> #undef NT_DLL_AUTO_IMAGE_MASK
> #define NT_DLL_AUTO_IMAGE_MASK \
> - ((bfd_vma) (${move_default_addr_high} ? 0x1ffff0000LL \
> - : 0x1ffff0000LL))
> + ((bfd_vma) (${cygwin_behavior} ? 0x1ffff0000LL \
> + : 0x1ffff0000LL))
> #else
> #undef NT_EXE_IMAGE_BASE
> #define NT_EXE_IMAGE_BASE \
> - ((bfd_vma) (${move_default_addr_high} ? 0x100010000LL \
> - : 0x10000LL))
> + ((bfd_vma) (${cygwin_behavior} ? 0x100010000LL \
> + : 0x10000LL))
> #undef NT_DLL_IMAGE_BASE
> #define NT_DLL_IMAGE_BASE \
> - ((bfd_vma) (${move_default_addr_high} ? 0x110000000LL \
> - : 0x10000000LL))
> + ((bfd_vma) (${cygwin_behavior} ? 0x110000000LL \
> + : 0x10000000LL))
> #undef NT_DLL_AUTO_IMAGE_BASE
> #define NT_DLL_AUTO_IMAGE_BASE \
> - ((bfd_vma) (${move_default_addr_high} ? 0x120000000LL \
> - : 0x61300000LL))
> + ((bfd_vma) (${cygwin_behavior} ? 0x120000000LL \
> + : 0x61300000LL))
> #undef NT_DLL_AUTO_IMAGE_MASK
> #define NT_DLL_AUTO_IMAGE_MASK \
> - ((bfd_vma) (${move_default_addr_high} ? 0x0ffff0000LL \
> - : 0x0ffc0000LL))
> + ((bfd_vma) (${cygwin_behavior} ? 0x0ffff0000LL \
> + : 0x0ffc0000LL))
> #undef PE_DEF_SECTION_ALIGNMENT
> #define PE_DEF_SUBSYSTEM 2
> #undef PE_DEF_FILE_ALIGNMENT
> --
> 2.30.1.windows.1
>
>
More information about the Binutils
mailing list