[PATCH lib/libXt] Fix _XtInherit on x86_64 Windows

Jon TURNEY jon.turney at dronecode.org.uk
Tue Apr 14 04:10:58 PDT 2015


From: Yaakov Selkowitz <yselkowitz at users.sourceforge.net>

As noted in Initialize.c, _XtInherit needs special treatment as it's both called
as a function, and used as a value to compare with.

We need to change this trickery for x86_64, as the symbols are no longer
underscore prefixed, and the address is 64 bits.

We also cannot place the trampoline in the .data section, as it may be marked
no-execute, so we use a special section for it instead.

v2: Uses of XtInherit must also be marked dllimport, so that they do not use a
thunk, but instead indirect via the __imp_XtInherit auto-import. This avoids
problems with an incorrect relocation being calculated in the case where libXt
and a library using it (e.g. libXaw/libXaw3d/libXm/etc.) are loaded more than
2GiB apart from each other.

This is enough to build a working libXt for Cygwin x86_64, because it uses the
LP64 data model.  I believe that more patches are needed for libXt to work
correctly when built for the Windows LLP64 data model.

Signed-off-by: Yaakov Selkowitz <yselkowitz at cygwin.com>
Reviewed-by: Jon TURNEY <jon.turney at dronecode.org.uk>
---
 include/X11/IntrinsicP.h | 7 ++++++-
 src/Initialize.c         | 9 +++++++++
 src/Makefile.am          | 2 +-
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/include/X11/IntrinsicP.h b/include/X11/IntrinsicP.h
index bb6570b..f2ded6f 100644
--- a/include/X11/IntrinsicP.h
+++ b/include/X11/IntrinsicP.h
@@ -266,7 +266,12 @@ extern Widget _XtWindowedAncestor( /* internal; implementation-dependent */
     Widget 		/* object */
 );
 
-extern void _XtInherit(
+#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(LIBXT_COMPILATION)
+__declspec(dllimport)
+#else
+extern
+#endif
+void _XtInherit(
     void
 );
 
diff --git a/src/Initialize.c b/src/Initialize.c
index 9783deb..61c8575 100644
--- a/src/Initialize.c
+++ b/src/Initialize.c
@@ -245,11 +245,20 @@ void _XtInherit(void)
  * cygwin-xfree: http://www.cygwin.com/ml/cygwin-xfree/2003-10/msg00000.html
  */
 
+#ifdef __x86_64__
+asm (".section .trampoline, \"dwx\" \n\
+ .globl _XtInherit        \n\
+ _XtInherit:              \n\
+    jmp *_y(%rip)         \n\
+_y: .quad __XtInherit     \n\
+    .text                 \n");
+#else
 asm (".data\n\
  .globl __XtInherit        \n\
  __XtInherit:      jmp *_y \n\
   _y: .long ___XtInherit   \n\
     .text                 \n");
+#endif
 
 #define _XtInherit __XtInherit
 #endif
diff --git a/src/Makefile.am b/src/Makefile.am
index 8c1a664..7f8ba6d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -7,7 +7,7 @@ SRCH_DEFINES = -DXFILESEARCHPATHDEFAULT=\"$(XFILESEARCHPATHDEFAULT)\"
 ERRORDB_DEFINES = -DERRORDB=\"$(ERRORDBDIR)/XtErrorDB\"
 
 AM_CFLAGS = $(CWARNFLAGS) $(XT_CFLAGS) $(SRCH_DEFINES) $(ERRORDB_DEFINES) \
-	$(XTMALLOC_ZERO_CFLAGS)
+	$(XTMALLOC_ZERO_CFLAGS) -DLIBXT_COMPILATION
 
 AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/include/X11 \
 	      -I$(top_builddir)/include -I$(top_builddir)/include/X11
-- 
2.1.4



More information about the xorg-devel mailing list