diff --git a/libretro/Retro68Runtime.h b/libretro/Retro68Runtime.h index 8a8f96bdad..b3091be5b7 100644 --- a/libretro/Retro68Runtime.h +++ b/libretro/Retro68Runtime.h @@ -48,6 +48,7 @@ void Retro68Relocate(); void Retro68CallConstructors(); +void Retro68CallDestructors(); void Retro68FreeGlobals(); #define RETRO68_RELOCATE() RETRO68_CALL_UNRELOCATED(Retro68Relocate,()) diff --git a/libretro/relocate.c b/libretro/relocate.c index 0b09081e96..4fb13b00aa 100644 --- a/libretro/relocate.c +++ b/libretro/relocate.c @@ -223,6 +223,19 @@ void Retro68CallConstructors() } } +void Retro68CallDestructors() +{ + char *p = (char*)&__fini_section; + char *e = (char*)&__fini_section_end; + p += 2; + while( p < e ) + { + (*(voidFunction)(*(long*)p))(); + p += 6; + } +} + + void Retro68FreeGlobals() { if(relocState.bssPtr != (Ptr) -1) diff --git a/libretro/start.c b/libretro/start.c index f4d514c57a..e4f47dd89d 100644 --- a/libretro/start.c +++ b/libretro/start.c @@ -33,6 +33,7 @@ int main(int argc, char* argv[]); void _start() { RETRO68_RELOCATE(); + atexit(&Retro68CallDestructors); Retro68CallConstructors(); int result;