Resending this mail cause the damn gmail fscked up my previous one...
Hi again, After three days of puking blood while wandering inside the GHC build system, I think I've found a possible solution to this messy problem... First, the "unknown symbol `__guard_local'" error is an entirely different beast than the random crashes at runtime with libgmp.a. Good news is kili's "SymE_NeedsProto" workaround effectively fixes it. On the other hand, the root cause of segmentation faults at runtime is that ghc requires a patched gmp library with customized memory allocation functions. Quoting from http://hackage.haskell.org/trac/ghc/wiki/ReplacingGMPNotes/TheCurrentGMPImplementation ---8<--- The most insidious and unique feature of the GHC implementation with GMP is memory management. GHC uses the special memory functions in GMP ( mp_set_memory_functions( (*alloc)(), (*realloc)(), (*dealloc)() ) to let GMP use GHC's own garbage collector. The memory functions are implemented in rts/sm/Storage.c as: static void* stgAllocForGMP (size_t size_in_bytes); static void stgDeallocForGMP (void *ptr STG_UNUSED, size_t size STG_UNUSED); static void* stgReallocForGMP (void *ptr, size_t old_size, size_t new_size); These special allocation functions bring most GMP memory usage into the GHC heap but do not seem that efficient otherwise. (I could be wrong --PDT.) Allocation uses the internal allocate() interface, so no garbage collection is performed during a GMP operation. Note that GMP operations may use these functions to allocate more memory themselves, after being called from Haskell code. The memory allocated is a simple array of words (W_), rounded up to a whole number. ---8<--- And indeed: $ nm /usr/ports/pobj/ghc-7.4.2-no_doc/ghc-7.4.2/libraries/integer-gmp/gmp/libgmp.a | grep stg U stgAllocForGMP U stgDeallocForGMP U stgReallocForGMP But since /usr/local/lib/libgmp.a comes from a vanilla gmp-5.0.2, we're totally belly-up! As a proof, try this: $ cd /usr/ports/devel/gmp $ make clean patch $ cd /usr/ports/pobj/gmp-5.0.2/gmp-5.0.2/ $ patch -NEp1 -i /usr/ports/pobj/ghc-7.4.2-no_doc/ghc-7.4.2/libraries/integer-gmp/gmp/tarball/patch $ cd - $ make fake $ sudo cp /usr/ports/pobj/gmp-5.0.2/fake-amd64/usr/local/lib/libgmp.a /usr/local/lib/libgmp.a and then repeat the fibonacci test: $ ghci GHCi, version 7.4.2: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Prelude> let fibs = 0 : 1 : zipWith (+) fibs (tail fibs) Prelude> let fib n = fibs!!n Prelude> fib 10000 33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812206564914032751086643394517512161526545361333111314042436854805106765843493523836959653428071768775328348234345557366719731392746273629108210679280784718035329131176778924659089938635459327894523777674406192240337638674004021330343297496902028328145933418826817683893072003634795623117103101291953169794607632737589253530772552375943788434504067715555779056450443016640119462580972216729758615026968443146952034614932291105970676243268515992834709891284706740862008587135016260312071903172086094081298321581077282076353186624611278245537208532365305775956430072517744315051539600905168603220349163222640885248852433158051534849622434848299380905070483482449327453732624567755879089187190803662058009594743150052402532709746995318770724376825907419939632265984147498193609285223945039707165443156421328157688908058783183404917434556270520223564846495196112460268313970975069382648706613264507665074611512677522748621598642530711298441182622661057163515069260029861704945425047491378115154139941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875 Prelude> Leaving GHCi. $ How to properly fix this problem (ports-wise speaking)? A working solution is to use the gmp library that comes bundled with GHC. While doing a build with my diff, for mysterious causes I caught another error: ---8<--- "inplace/bin/ghc-stage1" -o utils/hsc2hs/dist-install/build/tmp/hsc2hs -H32m -O -hide-all-packages -i -iutils/hsc2hs/. -iutils/hsc2hs/dist-install/build -iutils/hsc2hs/dist-install/build/autogen -Iutils/hsc2hs/dist-install/build -Iutils/hsc2hs/dist-install/build/autogen -optP-include -optPutils/hsc2hs/dist-install/build/autogen/cabal_macros.h -package base-4.5.1.0 -package containers-0.4.2.1 -package directory-1.1.0.2 -package process-1.1.0.1 -XHaskell98 -XCPP -XForeignFunctionInterface -no-user-package-conf -rtsopts -odir utils/hsc2hs/dist-install/build -hidir utils/hsc2hs/dist-install/build -stubdir utils/hsc2hs/dist-install/build -hisuf hi -osuf o -hcsuf hc utils/hsc2hs/dist-install/build/Main.o utils/hsc2hs/dist-install/build/HSCParser.o utils/hsc2hs/dist-install/build/DirectCodegen.o utils/hsc2hs/dist-install/build/CrossCodegen.o utils/hsc2hs/dist-install/build/UtilsCodegen.o utils/hsc2hs/dist-install/build/Common.o utils/hsc2hs/dist-install/build/C.o utils/hsc2hs/dist-install/build/Flags.o utils/hsc2hs/dist-install/build/Paths_hsc2hs.o /usr/ports/pobj/ghc-7.4.2-no_doc/ghc-7.4.2/rts/dist/build/libHSrts.a(RtsFlags.o): In function `copyArg': RtsFlags.c:(.text+0x2bd): warning: warning: strcpy() is almost always misused, please use strlcpy() /usr/ports/pobj/ghc-7.4.2-no_doc/ghc-7.4.2/rts/dist/build/libHSrts.a(RtsUtils.o): In function `showStgWord64': RtsUtils.c:(.text+0x329): warning: warning: sprintf() is often misused, please use snprintf() /usr/ports/pobj/ghc-7.4.2-no_doc/ghc-7.4.2/rts/dist/build/libHSrts.a(ffi64.o): In function `ffi_call': ../src/x86/ffi64.c:486:0: undefined reference to `ffi_call_unix64' /usr/ports/pobj/ghc-7.4.2-no_doc/ghc-7.4.2/rts/dist/build/libHSrts.a(ffi64.o): In function `ffi_prep_closure_loc': ../src/x86/ffi64.c:512:0: undefined reference to `ffi_closure_unix64' ---8<--- So I fixed this too... Here's the diff (attached), comments are highly appreciated. Ciao, David
ghc-fix.diff.gz
Description: Binary data