<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><span class=""></span><span class="">Hi all,</span><span class=""><br class=""><br class=""></span><span class="">I’m running into a strange problem when trying to use Mono 4.4.1.0 on an ARM architecture.<br class=""></span><span class=""><br class=""></span><span class="">When I try to execute a Mono application or simply run mcs, I get the following output:<br class=""></span><div class=""><br class=""></div><div class=""><font face="Courier New" class=""># mcs<br class="">* Assertion at unwind.c:385, condition `read16 (p) == (guint32)(op->when - loc)' not met<br class=""><br class="">Stacktrace:<br class=""><br class=""><br class="">Native stacktrace:<br class=""><br class=""><br class="">Debug info from gdb:<br class=""><br class=""><br class="">=================================================================<br class="">Got a SIGABRT while executing native code. This usually indicates<br class="">a fatal error in the mono runtime or one of the native libraries <br class="">used by your application.<br class="">=================================================================<br class=""><br class="">Aborted<br class=""></font><br class=""></div><div class=""><br class=""></div><div class="">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).</div><div class=""><br class=""></div><div class=""><span style="color: rgb(51, 51, 51); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; white-space: pre; background-color: rgb(255, 255, 255);" class="">} </span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; white-space: pre;">else</span><span style="color: rgb(51, 51, 51); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; white-space: pre; background-color: rgb(255, 255, 255);" class=""> </span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; white-space: pre;">if</span><span style="color: rgb(51, 51, 51); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; white-space: pre; background-color: rgb(255, 255, 255);" class=""> (op->when - loc > </span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; white-space: pre;">256</span><span style="color: rgb(51, 51, 51); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; white-space: pre; background-color: rgb(255, 255, 255);" class="">) {</span></div><div class=""><span style="color: rgb(51, 51, 51); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; white-space: pre; background-color: rgb(255, 255, 255);" class="">    *p ++ = DW_CFA_advance_loc2;</span></div><div class=""><span style="color: rgb(51, 51, 51); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; white-space: pre; background-color: rgb(248, 238, 199);" class="">    *(guint16*)p = (guint16)(op->when - loc);</span></div><div class=""><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; white-space: pre;">    g_assert</span><span style="color: rgb(51, 51, 51); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; white-space: pre; background-color: rgb(255, 255, 255);" class=""> (</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; white-space: pre;">read16</span><span style="color: rgb(51, 51, 51); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; white-space: pre; background-color: rgb(255, 255, 255);" class=""> (p) == (guint32)(op->when - loc));</span></div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">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. </div><div class=""><br class=""></div><span class="">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.</span><div class=""><span class=""><br class=""></span></div><div class=""><span class="">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 </span>mono_unwind_ops_encode_full actually does and when op->when - loc would actually be greater than 256.</div><div class=""><br class=""></div><div class="">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.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Thanks,</div><div class=""><br class=""></div><div class="">Henry</div></body></html>