changeset 24663:f5610b142363

Detect support of and add necessary CFLAGS to avoid crashes when loading Win32 DLLs on Mac OS X / Intel. based on patch by Ulion, ulion2002 gmail com
author diego
date Mon, 01 Oct 2007 22:46:33 +0000
parents 955f18ee1d8d
children 39b8a38f02b8
files configure loader/Makefile
diffstat 2 files changed, 22 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/configure	Mon Oct 01 21:22:41 2007 +0000
+++ b/configure	Mon Oct 01 22:46:33 2007 +0000
@@ -2301,6 +2301,25 @@
 echores $_named_asm_args
 
 
+if darwin && test "$cc_vendor" = "gnu" ; then
+echocheck "GCC support of -mstackrealign"
+# GCC 4.2 and some earlier Apple versions support this flag on x86. Since
+# Mac OS X/Intel has an ABI different from Windows this is needed to avoid
+# crashes when loading Win32 DLLs. Unfortunately some gcc versions create
+# wrong code with this flag, but this can be worked around by adding
+# -fno-unit-at-a-time as described in the blog post at
+# http://www.dribin.org/dave/blog/archives/2006/12/05/missing_third_param/
+cat > $TMPC << EOF
+__attribute__((noinline)) static int foo3(int i1, int i2, int i3) { return i3; }
+int main(void) { return foo3(1,2,3) == 3 ? 0 : 1; }
+EOF
+  cc_check -O4 -mstackrealign && tmp_run && _stackrealign=-mstackrealign
+  test -z "$_stackrealign" && cc_check -O4 -mstackrealign -fno-unit-at-a-time \
+    && tmp_run && _stackrealign="-mstackrealign -fno-unit-at-a-time"
+  test -n "$_stackrealign" && echores "yes" || echores "no"
+fi # if darwin && test "$cc_vendor" = "gnu" ; then
+
+
 # Checking for CFLAGS
 _install_strip="-s"
 if test "$_profile" != "" || test "$_debug" != "" ; then
@@ -7527,6 +7546,7 @@
 EXTRAXX_INC = $_inc_extra $_inc_extraxx
 OPTFLAGS = $CFLAGS \$(EXTRA_INC)
 CXXFLAGS = $CXXFLAGS \$(EXTRAXX_INC)
+CFLAG_STACKREALIGN = $_stackrealign
 INSTALLSTRIP = $_install_strip
 CHARSET = $_charset
 HELP_FILE = $_mp_help
--- a/loader/Makefile	Mon Oct 01 21:22:41 2007 +0000
+++ b/loader/Makefile	Mon Oct 01 22:46:33 2007 +0000
@@ -11,6 +11,8 @@
 # QTX emulation is not supported in Darwin
 ifneq ($(TARGET_OS),Darwin)
 SRCS_COMMON += wrapper.S
+else
+win32.o: CFLAGS += $(CFLAG_STACKREALIGN)
 endif
 endif