diff -aur a/dyngen.c b/dyngen.c --- a/dyngen.c 2005-12-19 14:51:53.000000000 -0800 +++ b/dyngen.c 2006-01-26 21:30:28.109776664 -0800 @@ -1196,7 +1196,7 @@ } else { #ifdef HOST_SPARC if (sym_name[0] == '.') - snprintf(name, sizeof(name), + snprintf(name, name_size, "(long)(&__dot_%s)", sym_name + 1); else @@ -1451,7 +1451,9 @@ if ((start_insn & ~0x1fff) == 0x9de3a000) { p_start += 0x4; start_offset += 0x4; - if ((int)(start_insn | ~0x1fff) < -128) + // if ((int)(start_insn | ~0x1fff) < -128) + // Why -128? op_pavgb_xmm adjusts the stack by -0x110 == -272 + if ((int)(start_insn | ~0x1fff) < -272) error("Found bogus save at the start of %s", name); if (end_insn1 != 0x81c7e008 || end_insn2 != 0x81e80000) error("ret; restore; not found at end of %s", name); diff -aur a/dyngen-exec.h b/dyngen-exec.h --- a/dyngen-exec.h 2005-12-19 14:51:53.000000000 -0800 +++ b/dyngen-exec.h 2006-01-26 21:30:18.492238752 -0800 @@ -231,6 +231,8 @@ #ifdef __sparc__ #define EXIT_TB() asm volatile ("jmpl %i0 + 8, %g0\n" \ "nop") +#define GOTO_LABEL_PARAM(n) asm volatile ( \ + "set " ASM_NAME(__op_gen_label) #n ", %g1; jmp %g1; nop") #endif #ifdef __arm__ #define EXIT_TB() asm volatile ("b exec_loop") Only in b: dyngen-exec.h.orig diff -aur a/sparc.ld b/sparc.ld --- a/sparc.ld 2005-12-19 14:51:53.000000000 -0800 +++ b/sparc.ld 2006-01-26 21:30:45.939066200 -0800 @@ -6,7 +6,7 @@ SECTIONS { /* Read-only sections, merged into text segment: */ - . = 0x60000000 + SIZEOF_HEADERS; + . = 0x60000000 + 0x400; .interp : { *(.interp) } .hash : { *(.hash) } .dynsym : { *(.dynsym) }