That doc says:

...This will usually manifest itself as a failure of dll-split during the build 
process with internal error: evacuate(static): strange closure type 0.

Which does not happen when I build.

Until this is fixed, the newer gold linker will be the only supported linker 
with GHC on ARM (at least when tables-next-to-code is enabled). GHC now checks 
that the linker being used isn’t affected by the bug in question, so hopefully 
users won’t be affected beyond needing to switch linkers.

And I don't get an error indicating this bug unless it is a warning missed in 
the massive build output.

So I assumed all was fixed. Nonetheless, I'll dig into the linker notes a bit 
more. Perhaps I should just try the gold linker if Ben does not respond to this 
enquiry.

Mike

Sent from my iPad

> On Jul 8, 2014, at 12:03 AM, Carter Schonwald <carter.schonw...@gmail.com> 
> wrote:
> 
> hrmmm, i seem to recall it being said that you need to use the GOLD linker on 
> ARM. (i think some of this is detailed in 
> http://bgamari.github.io/posts/2014-03-06-compiling-ghc-7.8-on-arm.html  )
> 
>  ,("ld command","arm-poky-linux-gnueabi-ld") 
> is that GOLD?
> 
> 
>> On Tue, Jul 8, 2014 at 1:51 AM, Michael Jones <m...@proclivis.com> wrote:
>> I am pasting both the info from the HOST and TARGET compilers:
>> 
>> HOST
>> ====
>> 
>>  [("Project name","The Glorious Glasgow Haskell Compilation System")
>>  ,("GCC extra via C opts"," -fwrapv")
>>  ,("C compiler command","/usr/bin/gcc")
>>  ,("C compiler flags"," -fno-stack-protector  -Wl,--hash-size=31 
>> -Wl,--reduce-memory-overheads")
>>  ,("ar command","/usr/bin/ar")
>>  ,("ar flags","q")
>>  ,("ar supports at file","YES")
>>  ,("touch command","touch")
>>  ,("dllwrap command","/bin/false")
>>  ,("windres command","/bin/false")
>>  ,("perl command","/usr/bin/perl")
>>  ,("target os","OSLinux")
>>  ,("target arch","ArchX86_64")
>>  ,("target word size","8")
>>  ,("target has GNU nonexec stack","True")
>>  ,("target has .ident directive","True")
>>  ,("target has subsections via symbols","False")
>>  ,("LLVM llc command","llc")
>>  ,("LLVM opt command","opt")
>>  ,("Project version","7.6.3")
>>  ,("Booter version","7.6.3")
>>  ,("Stage","2")
>>  ,("Build platform","x86_64-unknown-linux")
>>  ,("Host platform","x86_64-unknown-linux")
>>  ,("Target platform","x86_64-unknown-linux")
>>  ,("Have interpreter","YES")
>>  ,("Object splitting supported","YES")
>>  ,("Have native code generator","YES")
>>  ,("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 thr_debug_p")
>>  ,("Leading underscore","NO")
>>  ,("Debug on","False")
>>  ,("LibDir","/usr/lib/ghc")
>>  ,("Global Package DB","/usr/lib/ghc/package.conf.d")
>>  ,("Gcc Linker 
>> flags","[\"-Wl,--hash-size=31\",\"-Wl,--reduce-memory-overheads\"]")
>>  ,("Ld Linker flags","[\"--hash-size=31\",\"--reduce-memory-overheads\"]")
>>  ]
>> 
>> 
>> TARGET
>> =======
>> 
>>  [("Project name","The Glorious Glasgow Haskell Compilation System")
>>  ,("GCC extra via C opts"," -fwrapv")
>>  ,("C compiler command","arm-poky-linux-gnueabi-gcc")
>>  ,("C compiler flags"," -fno-stack-protector")
>>  ,("C compiler link flags","")
>>  ,("ld command","arm-poky-linux-gnueabi-ld")
>>  ,("ld flags","")
>>  ,("ld supports compact unwind","YES")
>>  ,("ld supports build-id","YES")
>>  ,("ld supports filelist","NO")
>>  ,("ld is GNU ld","YES")
>>  ,("ar command","/usr/bin/ar")
>>  ,("ar flags","q")
>>  ,("ar supports at file","YES")
>>  ,("touch command","touch")
>>  ,("dllwrap command","/bin/false")
>>  ,("windres command","/bin/false")
>>  ,("libtool command","libtool")
>>  ,("perl command","/usr/bin/perl")
>>  ,("target os","OSLinux")
>>  ,("target arch","ArchARM {armISA = ARMv5, armISAExt = [], armABI = HARD}")
>>  ,("target word size","4")
>>  ,("target has GNU nonexec stack","False")
>>  ,("target has .ident directive","True")
>>  ,("target has subsections via symbols","False")
>>  ,("Unregisterised","NO")
>>  ,("LLVM llc command","llc")
>>  ,("LLVM opt command","opt")
>>  ,("Project version","7.8.2")
>>  ,("Booter version","7.6.3")
>>  ,("Stage","1")
>>  ,("Build platform","x86_64-unknown-linux")
>>  ,("Host platform","x86_64-unknown-linux")
>>  ,("Target platform","arm-unknown-linux")
>>  ,("Have interpreter","YES")
>>  ,("Object splitting supported","NO")
>>  ,("Have native code generator","NO")
>>  ,("Support SMP","YES")
>>  ,("Tables next to code","YES")
>>  ,("RTS ways","l debug thr thr_debug thr_l  ")
>>  ,("Support dynamic-too","YES")
>>  ,("Support parallel --make","YES")
>>  ,("Dynamic by default","NO")
>>  ,("GHC Dynamic","NO")
>>  ,("Leading underscore","NO")
>>  ,("Debug on","False")
>>  ,("LibDir","/usr/local/lib/arm-unknown-linux-gnueabi-ghc-7.8.2")
>>  ,("Global Package 
>> DB","/usr/local/lib/arm-unknown-linux-gnueabi-ghc-7.8.2/package.conf.d")
>>  ]
>> 
>> 
>> 
>> 
>>> On Jul 7, 2014, at 10:42 PM, Carter Schonwald <carter.schonw...@gmail.com> 
>>> wrote:
>>> 
>>> could you share the output of ghc --info?
>>> 
>>> 
>>>> On Tue, Jul 8, 2014 at 12:10 AM, Michael Jones <m...@proclivis.com> wrote:
>>>> I am having problems building a GHC cross compiler for Linux (Yocto on a 
>>>> Wandboard) running on a Cortex A9, and need some advice on how to debug it.
>>>> 
>>>> The cross compiler produces an executable that runs on the Target, but 
>>>> fails to print. So I need help coming up with a strategy to narrow down 
>>>> the root cause.
>>>> 
>>>> Some details:
>>>> 
>>>> The application:
>>>> 
>>>> main = do
>>>>     putStrLn "Haskell start"
>>>> 
>>>> 
>>>> The command line options work. The program runs, and I can step through 
>>>> assembly. Debug data is printed to the console. But putStrLn fails, and 
>>>> program enters an infinite loop.
>>>> 
>>>> I compile my app as follows:
>>>> 
>>>> arm-unknown-linux-gnueabi-ghc -debug -static Main.hs
>>>> 
>>>> Using -threaded does not fix the problem.
>>>> 
>>>> Let me compare debug data from a run on my HOST, with a run on my TARGET. 
>>>> First, a run from my HOST:
>>>> 
>>>> created capset 0 of type 2
>>>> created capset 1 of type 3
>>>> cap 0: initialised
>>>> assigned cap 0 to capset 0
>>>> assigned cap 0 to capset 1
>>>> cap 0: created thread 1
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (suspended while making a foreign call)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (finished)
>>>> cap 0: created thread 2
>>>> cap 0: running thread 2 (ThreadRunGHC)
>>>> cap 0: thread 2 stopped (finished)
>>>> cap 0: starting GC
>>>> cap 0: GC working
>>>> cap 0: GC idle
>>>> cap 0: GC done
>>>> cap 0: GC idle
>>>> cap 0: GC done
>>>> cap 0: GC idle
>>>> cap 0: GC done
>>>> cap 0: GC idle
>>>> cap 0: GC done
>>>> cap 0: all caps stopped for GC
>>>> cap 0: finished GC
>>>> removed cap 0 from capset 0
>>>> removed cap 0 from capset 1
>>>> cap 0: shutting down
>>>> deleted capset 0
>>>> deleted capset 1
>>>> 
>>>> And, it prints properly. So this is my referenced for what it should do on 
>>>> the TARGET.
>>>> 
>>>> When I run on my TARGET, I get:
>>>> 
>>>> created capset 0 of type 2
>>>> created capset 1 of type 3
>>>> cap 0: initialised
>>>> assigned cap 0 to capset 0
>>>> assigned cap 0 to capset 1
>>>> cap 0: created thread 1
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (yielding)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (yielding)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (yielding)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (yielding)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (yielding)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (yielding)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (stack overflow)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (stack overflow)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (stack overflow)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (yielding)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (stack overflow)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (stack overflow)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (stack overflow)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (yielding)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (stack overflow)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (heap overflow)
>>>> cap 0: starting GC
>>>> cap 0: GC working
>>>> cap 0: GC idle
>>>> cap 0: GC done
>>>> cap 0: GC idle
>>>> cap 0: GC done
>>>> cap 0: GC idle
>>>> cap 0: GC done
>>>> cap 0: all caps stopped for GC
>>>> cap 0: finished GC
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (yielding)
>>>> cap 0: running thread 1 (ThreadRunGHC)
>>>> cap 0: thread 1 stopped (stack overflow)
>>>> ...
>>>> 
>>>> And the debug data goes on forever, just as debugging assembly 
>>>> demonstrated an infinite loop.
>>>> 
>>>> Clearly, the following does not occur:
>>>> 
>>>> cap 0: thread 1 stopped (suspended while making a foreign call)
>>>> 
>>>> And there are overflows.
>>>> 
>>>> If I had to guess, it is possible that some code is in a loop retrying to 
>>>> foreign call, and failing. Certainly, it is in some kind of a loop, 
>>>> because I found a place I can put a break point and and telling GDB to 
>>>> continue will cause the break over and over at the same place. So 
>>>> somewhere there is a loop.
>>>> 
>>>> I can step through the application with GDB and see names of files and 
>>>> offsets in assembly. But without a true source code debug, that is a bit 
>>>> rough, especially for someone that does not know the RTS code. If there 
>>>> was a way to compile such that C source code was available and a place to 
>>>> break, that would help. However, I suspect since it never makes a foreign 
>>>> call, there is no place in C to place the breakpoint anyway. So I am also 
>>>> assuming there is no direct way to debug with GDB.
>>>> 
>>>> But, I can see debug output printed to the console. My hope is there is a 
>>>> way to enable more printing, or a place I can add more print functions to 
>>>> help find the problem.
>>>> 
>>>> So I think I need one of the following:
>>>> 
>>>> - A solution from someone that has seen this before, perhaps on the iPhone
>>>> - How to enable more debug logging
>>>> - Where in the source code to add debug statements to narrow down the 
>>>> problem
>>>> 
>>>> Thanks for any help you can give.
>>>> 
>>>> Mike
>>>> 
>>>> 
>>>> _______________________________________________
>>>> Glasgow-haskell-users mailing list
>>>> Glasgow-haskell-users@haskell.org
>>>> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
> 
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to