On Fri, Jun 1, 2012 at 3:24 PM, Alex Rønne Petersen <alex@lycus.org> wrote:
On 01-06-2012 23:05, Matthew Caron wrote:
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?

Please try building libphobos and libdruntime with -fno-section-anchors.


You certainly need to do this, but -O0 means that section-anchors optimization is turned off anyway, so that isn't actually your problem. Can you run `disassemble` in gdb to see what the faulting instruction is?