Skip to content

[PATCH] OSX: undefined symbols; isysroot misconfiguration

Machine:

Processor:     3.06 GHz Intel Core 2 Duo
Architecture:  x86/x86_64
OS:            Mac OS X 10.6.5

Bootstrap GHC Info:

$ghc --info
 [("Project name","The Glorious Glasgow Haskell Compilation System")
 ,("Project version","7.0.0.20100924")
 ,("Booter version","6.12.3")
 ,("Stage","2")
 ,("Build platform","i386-apple-darwin")
 ,("Host platform","i386-apple-darwin")
 ,("Target platform","i386-apple-darwin")
 ,("Have interpreter","YES")
 ,("Object splitting","NO")
 ,("Have native code generator","YES")
 ,("Have llvm code generator","YES")
 ,("Use archives for ghci","True")
 ,("Support SMP","YES")
 ,("Unregisterised","NO")
 ,("Tables next to code","YES")
 ,("RTS ways","l debug  thr thr_debug thr_l thr_p  dyn debug_dyn thr_dyn thr_debug_dyn")
 ,("Leading underscore","YES")
 ,("Debug on","False")
 ,("LibDir","/Library/Frameworks/GHC.framework/Versions/700/usr/lib/ghc-7.0.0.20100924")
 ,("Global Package DB","/Library/Frameworks/GHC.framework/Versions/700/usr/lib/ghc-7.0.0.20100924/package.conf.d")
 ]

Note: Other configure options cause the error; the following just happens to be the last one I used.

Configure Info:

$./configure --build=i386-apple-darwin --host=i386-apple-darwin --target=x86_64-apple-darwin

...

Configure completed successfully.

   Building GHC version  : 7.1.20101203

   Build platform        : i386-apple-darwin
   Host platform         : i386-apple-darwin
   Target platform       : x86_64-apple-darwin

   Bootstrapping using   : /usr/bin/ghc
      which is version   : 7.0.0.20100924

   Using GCC             : /usr/bin/gcc
      which is version   : 4.2.1

   ld       : /usr/bin/ld
   Happy    : /usr/local/bin/happy (1.18.5)
   Alex     : /usr/local/bin/alex (2.3.3)
   Python   : /usr/bin/python
   Perl     : /usr/bin/perl
   dblatex  : /usr/local/bin/dblatex
   xsltproc : /usr/bin/xsltproc
   HsColour : /Users/x/.cabal/bin/HsColour

   Building DocBook HTML documentation : YES
   Building DocBook PS documentation   : YES
   Building DocBook PDF documentation  : YES

Error:

"/usr/bin/ghc"    -H32m -O  -package-conf libraries/bootstrapping.conf   -i -iutils/unlit/. -iutils/unlit/dist/build -iutils/unlit/dist/build/autogen -Iutils/unlit/dist/build -Iutils/unlit/dist/build/autogen        -no-user-package-conf -rtsopts     -c utils/unlit/unlit.c -o utils/unlit/dist/build/unlit.o
"inplace/bin/mkdirhier" utils/unlit/dist/build/tmp//.
"/usr/bin/gcc" -o utils/unlit/dist/build/tmp/unlit  -march=i686 -m32 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5 -fno-stack-protector              utils/unlit/dist/build/unlit.o    
Undefined symbols:
  "_fopen$UNIX2003", referenced from:
      _main in unlit.o
      _main in unlit.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make[1]: *** [utils/unlit/dist/build/tmp/unlit] Error 1
make: *** [all] Error 2

Hypothesis: GCC tries to use a hardcoded -isysroot from the following patch to compile unlit, which cannot be mixed with other components which seem to be using the default SDK on my machine. Even when I specify --with-macosx-deployment-target=10.5 for configure, unlit still fails. I'm thinking that the deployment target only affects stage 2 or something, so earlier stages are using a combination of the default SDK (in my case, 10.6) and the hardcoded one (10.5). Here's the patch that caused the problem:

[Tell gcc to support back to OS X 10.5
Ian Lynagh <igloo@earth.li>**20101203201558
 Ignore-this: f02d70e5b9cce50137981c6cb2b62a18
] hunk ./aclocal.m4 27
+    case $$1 in
+    i386-apple-darwin|x86_64-apple-darwin)
+        # We support back to OS X 10.5
+        $2="$$2 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5"
+        $3="$$3 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5"
+        ;;
+    esac
+

Temporary Workaround: Revert above patch and apply the following:

--- old-ghc/aclocal.m4	2010-12-05 14:29:54.000000000 -0500
+++ new-ghc/aclocal.m4	2010-12-05 14:29:54.000000000 -0500
@@ -24,6 +24,14 @@
         ;;
     esac
 
+    case $$1 in
+    i386-apple-darwin|x86_64-apple-darwin)
+        # Only support OS X 10.5 and later
+        $2="$$2 -mmacosx-version-min=10.5"
+        $3="$$3 -mmacosx-version-min=10.5"
+        ;;
+    esac
+
     # If gcc knows about the stack protector, turn it off.
     # Otherwise the stack-smash handler gets triggered.
     echo 'int main(void) {return 0;}' > conftest.c

Permanent Resolution: Instead of hardcoding -isysroot in aclocal.m4 (-mmacosx-version-min is fine to hard-code, though), we should have build, host, and target isysroots (or stage0, stage1, etc. isysroots), which are detected/specified by the configure script. It's possible that separate isysroots aren't necessary, however in any case, all the components in a stage must use the same isysroot if they're to be linked together.

Trac metadata
Trac field Value
Version 7.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Build System
Test case
Differential revisions
BlockedBy
Related
Blocking
CC william.knop.nospam@gmail.com
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information