http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48835
Thorsten Glaser <tg at mirbsd dot org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Host|m68k-linux |
--- Comment #3 from Thorsten Glaser <tg at mirbsd dot org> 2011-04-30 22:16:10
UTC ---
Actually, the backtrace is bogus. The problem lies here:
hostparm___elabs:
.LFB0:
.file 1 "../../src/gcc/ada/hostparm.ads"
[…]
move.l %d0,hostparm__Tnormalized_cwdS___SIZE_A_UNIT
move.l %d0,-(%sp)
.cfi_escape 0x2e,0x4
jsr __gnat_malloc
move.l %a0,%d2
move.l hostparm__Tnormalized_cwdS___SIZE_A_UNIT,-(%sp)
move.l hostparm__R6s,-(%sp)
0x8013707c move.l %a0,-(%sp)
.cfi_escape 0x2e,0xc
0x8013707e jsr memcpy
0x80137084 move.l %d2,hostparm__normalized_cwd
lea (16,%sp),%sp
.loc 1 38 0
movem.l -24(%fp),#252
unlk %fp
rts
.cfi_endproc
The call to memcpy above SIGSEGVs. Upon entering memcpy@plt, the
stack looks as follows:
0xefcdaab0: 0x80137084 0x8018668a 0x80a2688e 0x00000002
ret addr dst src len
(gdb) x 0x80a2688e
0x80a2688e <system__secondary_stack__chunk+24>: 0x2e2f0000
(gdb) x 0x8018668a
0x8018668a <system__soft_links__abort_undefer_nt>: 0x4e560000
tg@zigo:~/Xg/gcc-4.4-4.4.6/b68k $ nm gcc/gnat1 | fgrep -we
system__secondary_stack__chunk -e system__soft_links>
80a26876 b system__secondary_stack__chunk
8018668a T system__soft_links__abort_undefer_nt
So basically, this tries to overwrite space at T (.text segment).
__gnat_malloc is apparently assumed to return in a0…
… grepping gives:
ada/socket.c:extern void *__gnat_malloc32 (__SIZE_TYPE__);
ada/raise.h:extern void *__gnat_malloc (__SIZE_TYPE__);
ada/i-cstrin.adb: pragma Import (C, Memory_Alloc, "__gnat_malloc");
ada/s-memory.ads: pragma Export (C, Alloc, "__gnat_malloc");
I believe we may have our culprit, considering m68k return value locations.
Phew!