[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 |