[plt-scheme] Problems compiling mzscheme 4.2.4.2 on Solaris i386

From: Johan Coppieters (johan577 at mac.com)
Date: Thu Mar 4 08:49:31 EST 2010

Eli,

I don't know who maintains the (customized) libffi in mzscheme, but the libff library can't be compiled on Solaris/x86, because the Sun assembler does not support the syntax "xxxx-.", the few occurences that there are should be replaced with "xxxx at rel". (ofcourse with added conditional testing)

I tried compiling mzscheme without libffi, but then you get a limited scheme interpreter, which is not able among other things to run the webserver.

Below you can find the patches I applied to your sources (mz-4.2.4.5) and it compiled.
So nothing to do with an old gcc version (the one I first tried was a gcc 3.x), because you get the same errors with a gcc 4.x
True the libffi problem has been solved in gcc 4.x, but mzscheme uses its own version of libffi (which is still a 3.x version).


Kind regards,
Johan Coppieters.
-- 
E-mail: johan577 at me.com



Index: configure.ac
===================================================================
--- configure.ac
+++ configure.ac
@@ -240,6 +240,21 @@ if test x$TARGET = xSPARC; then
     fi
 fi
 
+if test x$TARGET = xX86 || test x$TARGET = xX86_64; then
+    AC_CACHE_CHECK([assembler supports pc related relocs],
+	libffi_cv_as_x86_pcrel, [
+	libffi_cv_as_x86_pcrel=yes
+	echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s
+	if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
+	    libffi_cv_as_x86_pcrel=no
+	fi
+	])
+    if test "x$libffi_cv_as_x86_pcrel" = xyes; then
+	AC_DEFINE(HAVE_AS_X86_PCREL, 1,
+		  [Define if your assembler supports PC relative relocs.])
+    fi
+fi
+
 AC_CACHE_CHECK([whether .eh_frame section should be read-only],
     libffi_cv_ro_eh_frame, [
 	libffi_cv_ro_eh_frame=no



Index: src/x86/sysv.S
===================================================================
--- src/x86/sysv.S
+++ src/x86/sysv.S
@@ -1,5 +1,6 @@
 /* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005  Red Hat, Inc.
+   sysv.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005, 2008
+   Red Hat, Inc.
    
    X86 Foreign Function Interface 
 
@@ -241,9 +242,20 @@ ffi_closure_SYSV:
 
 #if !FFI_NO_RAW_API
 
+/* Precalculate for e.g. the Solaris 10/x86 assembler.  */
+#if FFI_TRAMPOLINE_SIZE == 10
+#define RAW_CLOSURE_CIF_OFFSET 12
+#define RAW_CLOSURE_FUN_OFFSET 16
+#define RAW_CLOSURE_USER_DATA_OFFSET 20
+#elif FFI_TRAMPOLINE_SIZE == 24
+#define RAW_CLOSURE_CIF_OFFSET 24
+#define RAW_CLOSURE_FUN_OFFSET 28
+#define RAW_CLOSURE_USER_DATA_OFFSET 32
+#else
 #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
 #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
 #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
+#endif
 #define CIF_FLAGS_OFFSET 20
 
 	.align	4
@@ -342,10 +354,12 @@ ffi_closure_raw_SYSV:
 	.long	.LEFDE1-.LASFDE1	/* FDE Length */
 .LASFDE1:
 	.long	.LASFDE1-.Lframe1	/* FDE CIE offset */
-#ifdef __PIC__
+#if defined __PIC__ && defined HAVE_AS_X86_PCREL
 	.long	.LFB1-.	/* FDE initial location */
+#elif defined __PIC__
+	.long	.LFB1 at rel
 #else
-	.long	.LFB1	/* FDE initial location */
+	.long	.LFB1
 #endif
 	.long	.LFE1-.LFB1	/* FDE address range */
 #ifdef __PIC__
@@ -367,8 +381,10 @@ ffi_closure_raw_SYSV:
 	.long	.LEFDE2-.LASFDE2	/* FDE Length */
 .LASFDE2:
 	.long	.LASFDE2-.Lframe1	/* FDE CIE offset */
-#ifdef __PIC__
+#if defined __PIC__ && defined HAVE_AS_X86_PCREL
 	.long	.LFB2-.	/* FDE initial location */
+#elif defined __PIC__
+	.long	.LFB2 at rel
 #else
 	.long	.LFB2
 #endif
@@ -401,8 +417,10 @@ ffi_closure_raw_SYSV:
 	.long	.LEFDE3-.LASFDE3	/* FDE Length */
 .LASFDE3:
 	.long	.LASFDE3-.Lframe1	/* FDE CIE offset */
-#ifdef __PIC__
+#if defined __PIC__ && defined HAVE_AS_X86_PCREL
 	.long	.LFB3-.	/* FDE initial location */
+#elif defined __PIC__
+	.long	.LFB3 at rel
 #else
 	.long	.LFB3
 #endif



Index: src/x86/unix64.S
===================================================================
--- src/x86/unix64.S
+++ src/x86/unix64.S
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------
-   unix64.S - Copyright (c) 2002  Bo Thorsen <bo at suse.de>
+   unix64.S - Copyright (c) 2002, 2008  Bo Thorsen <bo at suse.de>
 
    x86-64 Foreign Function Interface 
 
@@ -87,7 +87,6 @@ ffi_call_unix64:
 	addq	%r11, %r10
 	jmp	*%r10
 
-	.section .rodata
 .Lstore_table:
 	.long	.Lst_void-.Lstore_table		/* FFI_TYPE_VOID */
 	.long	.Lst_sint32-.Lstore_table	/* FFI_TYPE_INT */
@@ -105,7 +104,6 @@ ffi_call_unix64:
 	.long	.Lst_struct-.Lstore_table	/* FFI_TYPE_STRUCT */
 	.long	.Lst_int64-.Lstore_table	/* FFI_TYPE_POINTER */
 
-	.text
 	.align 2
 .Lst_void:
 	ret
@@ -238,7 +236,6 @@ ffi_closure_unix64:
 	addq	%r11, %r10
 	jmp	*%r10
 
-	.section .rodata
 .Lload_table:
 	.long	.Lld_void-.Lload_table		/* FFI_TYPE_VOID */
 	.long	.Lld_int32-.Lload_table		/* FFI_TYPE_INT */
@@ -256,7 +253,6 @@ ffi_closure_unix64:
 	.long	.Lld_struct-.Lload_table	/* FFI_TYPE_STRUCT */
 	.long	.Lld_int64-.Lload_table		/* FFI_TYPE_POINTER */
 
-	.text
 	.align 2
 .Lld_void:
 	ret
@@ -349,7 +345,11 @@ ffi_closure_unix64:
 	.long	.LEFDE1-.LASFDE1	/* FDE Length */
 .LASFDE1:
 	.long	.LASFDE1-.Lframe1	/* FDE CIE offset */
+#if HAVE_AS_X86_PCREL
 	.long	.LUW0-.			/* FDE initial location */
+#else
+	.long	.LUW0 at rel
+#endif
 	.long	.LUW4-.LUW0		/* FDE address range */
 	.uleb128 0x0			/* Augmentation size */
 
@@ -387,7 +387,11 @@ ffi_closure_unix64:
 	.long	.LEFDE3-.LASFDE3	/* FDE Length */
 .LASFDE3:
 	.long	.LASFDE3-.Lframe1	/* FDE CIE offset */
+#if HAVE_AS_X86_PCREL
 	.long	.LUW5-.			/* FDE initial location */
+#else
+	.long	.LUW5 at rel
+#endif
 	.long	.LUW9-.LUW5		/* FDE address range */
 	.uleb128 0x0			/* Augmentation size */
 





On 02 Mar 2010, at 06:20, Eli Barzilay wrote:

> (Sorry for authorizing your earlier post, I missed the fact that it's
> the same one.)
> 
> On Mar  1, Johan Coppieters wrote:
>> Dear all,
>> 
>> I first build mzscheme from source on mac os x 10.6.2, everything
>> went fine, I developed a web application.
>> Now I want to run this in production on a Sun x2200 running Solaris
>> 5.10, using gcc 3.4.6, so I fetched the latest tarball and tried to
>> compile mzscheme on this machine, but no luck...
>> 
>> Anyone encountered this problem?
>> The build output is appended to this message.
> 
> It looks like the problem is with libffi -- I don't know what the
> problem is exactly, but you could just remove the "src/foreign"
> subdirectory and it will skip trying to compile the included libffi.
> (There is also pass `--disable-foreign' to configure, IIRC.)
> 
> -- 
>          ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
>                    http://barzilay.org/                   Maze is Life!



Posted on the users mailing list.