Commit 0c2c7562 authored by Yaakov Selkowitz's avatar Yaakov Selkowitz Committed by Jon Turney

Fix _XtInherit on x86_64 Windows

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: default avatarYaakov Selkowitz <yselkowitz@cygwin.com>
Reviewed-by: Jon Turney's avatarJon TURNEY <jon.turney@dronecode.org.uk>
Reviewed-by: default avatarColin Harrison <colin.harrison@virgin.net>
parent 171d82fa
......@@ -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
);
......
......@@ -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
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment