Hi all,

I’m running into a strange problem when trying to use Mono 4.4.1.0 on an ARM 
architecture.

When I try to execute a Mono application or simply run mcs, I get the following 
output:

# mcs
* Assertion at unwind.c:385, condition `read16 (p) == (guint32)(op->when - 
loc)' not met

Stacktrace:


Native stacktrace:


Debug info from gdb:


=================================================================
Got a SIGABRT while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
=================================================================

Aborted


The same application and mcs work fine with Mono 4.0.2, I used a while ago. 
Looking at the source code in mono/mini/unwind.c in function 
mono_unwind_ops_encode_full, I can see that the code tries to cast a pointer to 
a guint16 or guint32 pointer, which will fail on (my) ARM when the address is 
not aligned (lines 378 and 384).

} else if (op->when - loc > 256) {
    *p ++ = DW_CFA_advance_loc2;
    *(guint16*)p = (guint16)(op->when - loc);
    g_assert (read16 (p) == (guint32)(op->when - loc));


What is interesting, is that the g_assert is using the read16 macro, which 
deals with alignment issues and also endianness. But with this, I can’t really 
see how the code would work successfully with big endianness either. 

The code in question hasn’t changed between 4.0 and 4.4 but the pointer casting 
is only executed when “op->when - loc > 256” is true. So I wonder why this 
changed for me between 4.0 and 4.4 and if I’m even supposed to run into these 
cases on an ARM architecture? When I fix the two problems, everything seems to 
run fine.

Because I don’t think that I’m the first to try to execute “mcs” or run a Mono 
application on an ARM architecture, I kind of blame my build system. I use 
buildroot and run my system on an ARM 926 device. Unfortunately, I have no idea 
what the code in mono_unwind_ops_encode_full actually does and when op->when - 
loc would actually be greater than 256.

I hope that someone here could give me some pointers on why the if condition 
could be true and never was before or in fact is not true for any ARM device, 
so I can check my build system.


Thanks,

Henry
_______________________________________________
Mono-devel-list mailing list
[email protected]
http://lists.dot.net/mailman/listinfo/mono-devel-list

Reply via email to