This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[patch] New toolchain: x86_64-pc-cygwin
- From: Corinna Vinschen <vinschen at redhat dot com>
- To: binutils at sourceware dot org
- Date: Thu, 28 Feb 2013 19:54:13 +0100
- Subject: [patch] New toolchain: x86_64-pc-cygwin
[Please keep me CCed, I'm not subscribed to the binutils ML]
Hi, right now we're at Red Hat are in the process of creating a Cygwin
version which runs on AMD64 Windows. The current state of the efforts
can be visited in the cygwin-64bit-branch branch on sourceware. A running
micro distro can be downloaded from ftp://cygwin.com/pub/cygwin/64bit/
Below is the basic binutils patchset required to get the x86_64-pc-cygwin
toolchain running. The toolchain is based on the already existing
x86_64-w64-mingw32 toolchain, just that Cygwin will use a LP64 data model,
rather than a LLP64 data model. However, thanks to the existing efforts
to support a 64 bit pe/coff toolchain, the patch needed to get a 64 bit
Cygwin working is pretty small.
Is the below patch ok to apply?
Thanks,
Corinna
bfd/ChangeLog:
* config.bfd: Add x86_64-*-cygwin to list of supported targets.
binutils/ChangeLog:
* configure.in: Build DLL tools on x86_64-*-cygwin* as well.
* configure: Regenerate.
ld/ChangeLog:
* configure.host: Add x86_64-*-cygwin* as valid host.
* configure.tgt: Add x86_64-*-cygwin* as valid target.
* emultempl/pep.em: Handle different requirements for Cygwin in terms
of start addresses for executables and DLLs, based on memory model in
http://cygwin.com/ml/cygwin-developers/2013-02/msg00027.html
Index: bfd/config.bfd
===================================================================
RCS file: /cvs/src/src/bfd/config.bfd,v
retrieving revision 1.308
diff -u -p -r1.308 config.bfd
--- bfd/config.bfd 26 Feb 2013 22:07:55 -0000 1.308
+++ bfd/config.bfd 28 Feb 2013 18:34:50 -0000
@@ -673,7 +673,7 @@ case "${targ}" in
targ_archs="$targ_archs bfd_arm_arch"
want64=true
;;
- x86_64-*-mingw* | x86_64-*-pe | x86_64-*-pep)
+ x86_64-*-mingw* | x86_64-*-pe | x86_64-*-pep | x86_64-*-cygwin)
targ_defvec=x86_64pe_vec
targ_selvecs="x86_64pe_vec x86_64pei_vec bfd_elf64_x86_64_vec bfd_elf64_l1om_vec bfd_elf64_k1om_vec i386pe_vec i386pei_vec bfd_elf32_i386_vec"
want64=true
Index: binutils/configure
===================================================================
RCS file: /cvs/src/src/binutils/configure,v
retrieving revision 1.153
diff -u -p -r1.153 configure
--- binutils/configure 30 Oct 2012 12:44:54 -0000 1.153
+++ binutils/configure 28 Feb 2013 18:34:53 -0000
@@ -672,6 +672,7 @@ CPP
am__fastdepCC_FALSE
am__fastdepCC_TRUE
CCDEPMODE
+am__nodep
AMDEPBACKSLASH
AMDEP_FALSE
AMDEP_TRUE
@@ -3707,6 +3708,7 @@ fi
if test "x$enable_dependency_tracking" != xno; then
am_depcomp="$ac_aux_dir/depcomp"
AMDEPBACKSLASH='\'
+ am__nodep='_no'
fi
if test "x$enable_dependency_tracking" != xno; then
AMDEP_TRUE=
@@ -3769,11 +3771,11 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}ma
# We need awk for the "check" target. The system "awk" is bad on
# some platforms.
-# Always define AMTAR for backward compatibility.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
-AMTAR=${AMTAR-"${am_missing_run}tar"}
-
-am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
@@ -3791,6 +3793,7 @@ else
# instance it was reported that on HP-UX the gcc test will end up
# making a dummy file named `D' -- because `-MD' means `put the output
# in D'.
+ rm -rf conftest.dir
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory.
@@ -3850,7 +3853,7 @@ else
break
fi
;;
- msvisualcpp | msvcmsys)
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
# This compiler won't grok `-c -o', but also, the minuso test has
# not run yet. These depmodes are late enough in the game, and
# so weak that their functioning should not be impacted.
@@ -11212,7 +11215,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11215 "configure"
+#line 11218 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -11318,7 +11321,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11321 "configure"
+#line 11324 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -13996,7 +13999,7 @@ do
BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
;;
- x86_64-*-mingw*)
+ x86_64-*-mingw* | x86_64-*-cygwin*)
BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
if test -z "$DLLTOOL_DEFAULT"; then
DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_MX86_64"
@@ -14006,7 +14009,7 @@ do
BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
BUILD_DLLWRAP='$(DLLWRAP_PROG)$(EXEEXT)'
;;
- i[3-7]86-*-pe* | i[3-7]86-*-cygwin* | i[3-7]86-*-mingw32** | i[3-7]86-*-netbsdpe*)
+ i[3-7]86-*-pe* | i[3-7]86-*-cygwin* | i[3-7]86-*-mingw** | i[3-7]86-*-netbsdpe*)
BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
if test -z "$DLLTOOL_DEFAULT"; then
DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_I386"
Index: binutils/configure.in
===================================================================
RCS file: /cvs/src/src/binutils/configure.in,v
retrieving revision 1.116
diff -u -p -r1.116 configure.in
--- binutils/configure.in 17 Dec 2012 16:55:39 -0000 1.116
+++ binutils/configure.in 28 Feb 2013 18:34:53 -0000
@@ -302,7 +302,7 @@ changequote([,])dnl
BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
;;
- x86_64-*-mingw*)
+ x86_64-*-mingw* | x86_64-*-cygwin*)
BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
if test -z "$DLLTOOL_DEFAULT"; then
DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_MX86_64"
@@ -313,7 +313,7 @@ changequote([,])dnl
BUILD_DLLWRAP='$(DLLWRAP_PROG)$(EXEEXT)'
;;
changequote(,)dnl
- i[3-7]86-*-pe* | i[3-7]86-*-cygwin* | i[3-7]86-*-mingw32** | i[3-7]86-*-netbsdpe*)
+ i[3-7]86-*-pe* | i[3-7]86-*-cygwin* | i[3-7]86-*-mingw** | i[3-7]86-*-netbsdpe*)
changequote([,])dnl
BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
if test -z "$DLLTOOL_DEFAULT"; then
Index: ld/configure.host
===================================================================
RCS file: /cvs/src/src/ld/configure.host,v
retrieving revision 1.53
diff -u -p -r1.53 configure.host
--- ld/configure.host 19 Jan 2013 19:36:33 -0000 1.53
+++ ld/configure.host 28 Feb 2013 18:34:54 -0000
@@ -171,7 +171,7 @@ i[3-7]86-pc-interix*)
HOSTING_LIBS='-L $$X/local_bin -L $$INTERIX_ROOT/usr/lib '"$HOSTING_LIBS"' -lcpsx -lc -lcpsx $$INTERIX_ROOT/usr/lib/psxdll.a $$INTERIX_ROOT/usr/lib/psxdll2.a'
;;
-i[3-7]86-*-cygwin*)
+i[3-7]86-*-cygwin* | x86_64-*-cygwin*)
HOSTING_LIBS="$HOSTING_LIBS"' -lcygwin -L/usr/lib/w32api -luser32 -lkernel32 -ladvapi32 -lshell32 `if [ -f ../gcc/libgcc.a ] ; then echo ../gcc/libgcc.a ; else ${CC} -print-libgcc-file-name; fi`'
;;
Index: ld/configure.tgt
===================================================================
RCS file: /cvs/src/src/ld/configure.tgt,v
retrieving revision 1.278
diff -u -p -r1.278 configure.tgt
--- ld/configure.tgt 6 Feb 2013 23:22:18 -0000 1.278
+++ ld/configure.tgt 28 Feb 2013 18:34:54 -0000
@@ -316,6 +316,10 @@ i[3-7]86-*-mingw32*) targ_emul=i386pe ;
x86_64-*-pe | x86_64-*-pep) targ_emul=i386pep ;
targ_extra_emuls=i386pe ;
targ_extra_ofiles="deffilep.o pep-dll.o pe-dll.o" ;;
+x86_64-*-cygwin) targ_emul=i386pep ;
+ targ_extra_emuls=i386pe
+ targ_extra_ofiles="deffilep.o pep-dll.o pe-dll.o"
+ test "$targ" != "$host" && LIB_PATH='${tooldir}/lib/w32api' ;;
x86_64-*-mingw*) targ_emul=i386pep ;
targ_extra_emuls=i386pe
targ_extra_ofiles="deffilep.o pep-dll.o pe-dll.o" ;;
@@ -821,7 +825,7 @@ spu-*-elf*)
NATIVE_LIB_DIRS='/lib'
;;
-i[03-9x]86-*-cygwin*)
+i[03-9x]86-*-cygwin* | x86_64-*-cygwin*)
NATIVE_LIB_DIRS='/usr/lib /usr/lib/w32api'
;;
Index: ld/emultempl/pep.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/pep.em,v
retrieving revision 1.50
diff -u -p -r1.50 pep.em
--- ld/emultempl/pep.em 10 Jan 2013 20:08:03 -0000 1.50
+++ ld/emultempl/pep.em 28 Feb 2013 18:34:55 -0000
@@ -5,6 +5,16 @@ if [ -z "$MACHINE" ]; then
else
OUTPUT_ARCH=${ARCH}:${MACHINE}
fi
+
+case ${target} in
+ *-*-cygwin*)
+ move_default_addr_high=1
+ ;;
+ *)
+ move_default_addr_high=0;
+ ;;
+esac
+
rm -f e${EMULATION_NAME}.c
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
fragment <<EOF
@@ -89,9 +99,39 @@ fragment <<EOF
#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 \
+ : 0x400000LL))
+#undef NT_DLL_IMAGE_BASE
+#define NT_DLL_IMAGE_BASE \
+ ((bfd_vma) (${move_default_addr_high} ? 0x400000000LL \
+ : 0x10000000LL))
+#undef NT_DLL_AUTO_IMAGE_BASE
+#define NT_DLL_AUTO_IMAGE_BASE \
+ ((bfd_vma) (${move_default_addr_high} ? 0x400000000LL \
+ : 0x61300000LL))
+#undef NT_DLL_AUTO_IMAGE_MASK
+#define NT_DLL_AUTO_IMAGE_MASK \
+ ((bfd_vma) (${move_default_addr_high} ? 0x1ffff0000LL \
+ : 0x0ffc0000LL))
#else
#undef NT_EXE_IMAGE_BASE
-#define NT_EXE_IMAGE_BASE 0x00010000
+#define NT_EXE_IMAGE_BASE \
+ ((bfd_vma) (${move_default_addr_high} ? 0x100010000LL \
+ : 0x10000LL))
+#undef NT_DLL_IMAGE_BASE
+#define NT_DLL_IMAGE_BASE \
+ ((bfd_vma) (${move_default_addr_high} ? 0x110000000LL \
+ : 0x10000000LL))
+#undef NT_DLL_AUTO_IMAGE_BASE
+#define NT_DLL_AUTO_IMAGE_BASE \
+ ((bfd_vma) (${move_default_addr_high} ? 0x120000000LL \
+ : 0x61300000LL))
+#undef NT_DLL_AUTO_IMAGE_MASK
+#define NT_DLL_AUTO_IMAGE_MASK \
+ ((bfd_vma) (${move_default_addr_high} ? 0x0ffff0000LL \
+ : 0x0ffc0000LL))
#undef PE_DEF_SECTION_ALIGNMENT
#define PE_DEF_SUBSYSTEM 2
#undef PE_DEF_FILE_ALIGNMENT
@@ -808,7 +848,7 @@ static bfd_vma
compute_dll_image_base (const char *ofile)
{
bfd_vma hash = (bfd_vma) strhash (ofile);
- return 0x61300000 + ((hash << 16) & 0x0FFC0000);
+ return NT_DLL_AUTO_IMAGE_BASE + ((hash << 16) & NT_DLL_AUTO_IMAGE_MASK);
}
#endif
--
Corinna Vinschen
Cygwin Maintainer
Red Hat