@@ -380,10 +380,13 @@ #ifdef OF_AMIGAOS_M68K OF_M68K_ARG(struct ObjFWBase *, base, a6) #else register struct ObjFWBase *r12 __asm__("r12"); struct ObjFWBase *base = r12; +#endif +#ifdef OF_MORPHOS + void *frame; #endif uintptr_t *iter, *iter0; if (version > 1) return false; @@ -403,14 +406,18 @@ (&_EH_FRAME_OBJECTS__)[i]); iter0 = &__CTOR_LIST__[1]; #elif defined(OF_MORPHOS) __asm__ ( - "lis %0, ctors+4@ha\n\t" - "la %0, ctors+4@l(%0)\n\t" - : "=r"(iter0) + "lis %0, __EH_FRAME_BEGIN__@ha\n\t" + "la %0, __EH_FRAME_BEGIN__@l(%0)\n\t" + "lis %1, __CTOR_LIST__@ha\n\t" + "la %1, __CTOR_LIST__@l(%1)\n\t" + : "=r"(frame), "=r"(iter0) ); + + libc.__register_frame(frame); #endif for (iter = iter0; *iter != 0; iter++); while (iter > iter0) { @@ -732,11 +739,16 @@ #endif }; #ifdef OF_MORPHOS __asm__ ( + ".section .eh_frame, \"aw\", @progbits\n" + ".globl __EH_FRAME_BEGIN__\n" + ".type __EH_FRAME_BEGIN__, @object\n" + "__EH_FRAME_BEGIN__:\n" ".section .ctors, \"aw\", @progbits\n" - "ctors:\n" - " .long -1\n" + ".globl __CTOR_LIST__\n" + ".type __CTOR_LIST__, @object\n" + "__CTOR_LIST__:\n" ".section .text" ); #endif