[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