[erlang-questions] Erlang in Debian on m68k architecture
Mikael Pettersson
mikpe@REDACTED
Thu Jan 25 13:46:10 CET 2007
Sergei Golovan writes:
> On 1/25/07, Mikael Pettersson <mikpe@REDACTED> wrote:
> > Definitely smells like a toolchain bug to me. In this case, since you've
> > enabled threads, erts_mtx_t is a properly declared struct type containing
> > among other things a pthread_mutex_t, an int, and a couple of pointers.
> > I don't remember how strict M68K is about alignment, but presumably it wants
> > non-arbitrary alignment for word-sized fields, especially perhaps if they're
> > used for atomic accesses.
> >
> > The error could be in gcc, gas, ld, or even libc.
> >
> > As GDB session on the core dump should tell us more about the location
> > of the crash, the failing instruction, and what data it tried to access.
>
> Here are two backtraces, without and with DEBUG defined. If you need
> some additional info, I'll try to give it also
...
> With debug.
> -----------------------------------------------------
> (gdb) bt
> #0 0xc0103522 in kill () from /lib/libc.so.6
> #1 0xc004a87e in pthread_kill () from /lib/libpthread.so.0
> #2 0xc004a8b6 in raise () from /lib/libpthread.so.0
> #3 0xc0103380 in raise () from /lib/libc.so.6
> #4 0xc0104266 in abort () from /lib/libc.so.6
> #5 0x8009b534 in et_abort (expr=0x800fb643 "_is_aligned(x)",
> file=0x800fa37f "beam/erl_lock_check.c", line=1018) at
> beam/erl_term.c:45
> #6 0x8009c1b4 in checked_make_boxed (x=0x0, file=0x800fa37f
> "beam/erl_lock_check.c", line=1018) at beam/erl_term.c:123
> #7 0x80092bca in erts_lc_init_lock (lck=0x8015abe2, name=0x800f0178
> "binary_alloc", flags=0) at beam/erl_lock_check.c:1018
> #8 0x800504c0 in erts_mtx_init (mtx=0x8015abba, name=0x800f0178
> "binary_alloc") at beam/erl_threads.h:249
> #9 0x800731e6 in erts_init_binary () at beam/binary.c:40
> #10 0x8002d85c in erl_init () at beam/erl_init.c:211
> #11 0x8002e568 in erl_start (argc=37, argv=0xeffff58c) at beam/erl_init.c:907
> #12 0x8001a6fe in main (argc=37, argv=0xeffff584) at sys/unix/erl_main.c:28
> -----------------------------------------------------
What's happening is that an embedded Eterm field in the mutex,
placed there and used by the lock checker, isn't word-aligned,
which triggers an abort() in make_boxed(). In your non-debug
GDB trace this error went unnoticed but later on _seriously_
broke the GC.
The problem is still one of alignment. It seems that your M68K
toolchain doesn't align
struct { int x; } var;
to a 32-bit boundary. Whether that is the bug, or whether the
lock checker's alignment-of-static-data assumption is the bug,
I cannot tell until someone sends me a pointer to the M68K Linux
(or SVR4) ABI document.
/Mikael
More information about the erlang-questions
mailing list