libphobos on ARM

Matthew Caron Matt.Caron at redlion.net
Fri Jun 1 14:05:43 PDT 2012


Hey folks,

So, I've used the instructions and code here:

https://bitbucket.org/goshawk/gdc/wiki/crosstool-ng

to build a gdc for ARM.

I've written up a simple "Hello world" and I get an Illegal Instruction 
when executing on my ARM Linux EABI system.

GDB says (edited to remove standard stuff):

==
(gdb) run
Starting program: /hello

Program received signal SIGILL, Illegal instruction.
0x0002f5c4 in _D2gc3gcx2GC6mallocMFkkPkZPv (this=@0x96018, size=88, bits=1,
     alloc_size=0x0)
     at 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/gc/gcx.d:1224
1224 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/gc/gcx.d: No 
such file or directory.
         in 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/gc/gcx.d
Current language:  auto; currently minimal
(gdb) bt full
#0  0x0002f5c4 in _D2gc3gcx2GC6mallocMFkkPkZPv (this=@0x96018, size=88,
     bits=1, alloc_size=0x0)
     at 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/gc/gcx.d:1224
No locals.
#1  0x0002692c in gc.gc.gc_malloc (sz=<value optimized out>,
     ba=<value optimized out>)
     at 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/gc/gc.d:201
No locals.
#2  0x00019ad0 in _d_newclass (ci=@0x8e8bc)
     at 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/rt/lifetime.d:123
         p = Unhandled dwarf expression opcode 0x9f
==

So, the error is at line 1224 of gcx.d, which is:

==
     /**
      * add range to scan for roots
      */
     void addRange(void *p, size_t sz)
     {
         if (!p || !sz) // 1224
         {
             return;
         }
==

The full backtrace is less than useful here, because of optimizations in 
libphobos, so I've recompiled libphobos with -O0. Recompiling my program 
and re-running it gives me:

==
(gdb) run
Starting program: /hello
Hello gents

Program received signal SIGILL, Illegal instruction.
0x0004535c in _D2gc3gcx3Gcx16fullcollectshellMFZk (this=Cannot access 
memory at address 0x1
)
     at 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/gc/gcx.d:245
245 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/gc/gcx.d: No 
such file or directory.
         in 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/gc/gcx.d
Current language:  auto; currently minimal
(gdb) bt full
#0  0x0004535c in _D2gc3gcx3Gcx16fullcollectshellMFZk (this=Cannot 
access memory at address 0x1
)
     at 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/gc/gcx.d:245
No locals.
#1  0x000418ec in _D2gc3gcx2GC18fullCollectNoStackMFZv (this=@0xe4018)
     at 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/gc/gcx.d:245
         __sync33 = (struct TypeInfo_Class &) @0xdce4c: {init = {length 
= 8,
     ptr = 0xbc81c "4�v"}, name = {length = 13,
     ptr = 0xbc824 "gc.gcx.GCLock"}, vtbl = {length = 6, ptr = 0xbc834},
   interfaces = {length = 0, ptr = 0x0}, base = @0xda804, destructor = 0x0,
   classInvariant = 0, m_flags = 54, deallocator = 0x0, m_offTi = 
{length = 0,
     ptr = 0x0}, defaultConstructor = 0x0, xgetMembers = 0}
#2  0x0003ca34 in gc_term ()
     at 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/gc/gc.d:133
No locals.
#3  0x00022e2c in rt.dmain2.main.runAll (this=0xbe9e7cd8)
     at 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/rt/dmain2.d:67
No locals.
#4  0x000227c4 in rt.dmain2.main.tryExec (this=0xbe9e7cd8, dg=
       {object = 0xbe9e7cd8, func = 0x22d94 <rt.dmain2.main.runAll>})
---Type <return> to continue, or q <return> to quit---
     at 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/rt/dmain2.d:67
No locals.
#5  0x000225ac in main (argc=1, argv=0xbe9e7e64)
     at 
/home/mattc/workspace/d/buildder/.build/src/gcc-4.6.2/libphobos/rt/dmain2.d:67
         trapExceptions = true
         am = (struct char[] *) 0xe4008
         result = 0
         args = {length = 1, ptr = 0xe4008}
==

This actually does print the "Hello gents" that it is supposed to, but 
then dies after (likely when exiting and collecting all its memory).

The line referenced is in the following:
==
{{{
     void initialize() // 245
     {
         gcLock = GCLock.classinfo;
         gcx = cast(Gcx*)cstdlib.calloc(1, Gcx.sizeof);
         if (!gcx)
             onOutOfMemoryError();
         gcx.initialize();
         setStackBottom(rt_stackBottom());
     }
}}}

I should note that I tested the gcc which was built along with gdc and 
it does produce a "Hello world" application which appears to work correctly.

Does anyone have any ideas/pointers/hey there, do it this way, dummy/etc?
-- 
Matthew Caron, Build Engineer
Sixnet, a Red Lion business | www.sixnet.com
+1 (518) 877-5173 x138 office


More information about the D.gnu mailing list