I've been chasing it for about a week now, but have finally isolated the cause of the ARM problems I mentioned.
I've been using the default Ubuntu Maverick environment on the Efika MX, due to the lack of TO3-capable Debian image. This has three remotely relevant versions of GCC available:
- 4.3.5-3ubuntu1
- 4.4.4-14ubuntu5
- 4.5.1-7ubuntu2
After a significant number of fights with CFLAGS to try and build a more cut-down Mono, I started trying the multiple GCC releases, and found that whilst the gcc-4.3 package produced a fully functional Mono binary, the other two produced a Mono binary which would hang forever (or throw SIGILL or SIGSEGV) when faced with a NullReferenceException in executed code, likely due to Thumb instructions in the wrong place. Vincent Sanders and Geoff Norton helped greatly with debugging the Mono runtime to isolate where the issues were happening.
On a hunch, I tried the same set of compiler packages in Debian:
Now, the interesting thing is, in Debian, all three compilers produce a working Mono runtime. The difference? As far as I can determine, Linaro patches to GCC. gcc-4.3 is the only Ubuntu compiler without Linaro patches - and also the only functional Ubuntu compiler.
There's now a bug opened to track this issue: https://bugs.launchpad.net/gcc-linaro/+bug/667225