Index: src/runtime/ObjFW_RT.sfd ================================================================== --- src/runtime/ObjFW_RT.sfd +++ src/runtime/ObjFW_RT.sfd @@ -2,11 +2,11 @@ ==basetype struct Library * ==libname objfw_rt.library ==bias 30 ==public * Functions for the linklib -void objc_init(struct objc_libc *libc, FILE *stdout, FILE *stdin)(a0,a1,a2) +bool objc_init(unsigned int version, struct objc_libc *libc, FILE *stdout, FILE *stdin)(d0,a0,a1,a2) * Used by the compiler - these need glue code void glue___objc_exec_class(void *_Nonnull module)(a0) IMP _Nonnull glue_objc_msg_lookup(id _Nullable obj, SEL _Nonnull sel)(a0,a1) IMP _Nonnull glue_objc_msg_lookup_stret(id _Nullable obj, SEL _Nonnull sel)(a0,a1) IMP _Nonnull glue_objc_msg_lookup_super(struct objc_super *_Nonnull super, SEL _Nonnull sel)(a0,a1) Index: src/runtime/amiga-library.m ================================================================== --- src/runtime/amiga-library.m +++ src/runtime/amiga-library.m @@ -147,10 +147,12 @@ data_size = (uintptr_t)&__data_size - ((uintptr_t)&__a4_init - DATA_OFFSET); if ((child->data_seg = AllocMem(data_size, MEMF_ANY)) == NULL) { + FreeMem((char *)child - child->library.lib_NegSize, + child->library.lib_NegSize + child->library.lib_PosSize); base->library.lib_OpenCnt--; return NULL; } memcpy(child->data_seg, base->data_seg - DATA_OFFSET, data_size); @@ -204,12 +206,11 @@ OBJC_M68K_ARG(struct ObjFWRTBase *, base, REG_A6) if (base->parent != NULL) { struct ObjFWRTBase *parent; - if (base->initialized && - (size_t)_EH_FRAME_BEGINS__ == (size_t)_EH_FRAME_OBJECTS__) + if (base->initialized) for (size_t i = 1; i <= (size_t)_EH_FRAME_BEGINS__; i++) base->libc.__deregister_frame_info( (&_EH_FRAME_BEGINS__)[i]); parent = base->parent; @@ -233,27 +234,32 @@ lib_null(void) { return 0; } -static void __saveds -objc_init(struct ObjFWRTBase *base OBJC_M68K_REG("a6"), +static bool __saveds +objc_init(unsigned int version OBJC_M68K_REG("d0"), struct objc_libc *libc OBJC_M68K_REG("a0"), FILE *stdout_ OBJC_M68K_REG("a1"), FILE *stderr_ OBJC_M68K_REG("a2")) { + register struct ObjFWRTBase *base OBJC_M68K_REG("a6"); uintptr_t *iter, *iter0; + + if (version > 1) + return false; memcpy(&base->libc, libc, sizeof(base->libc)); stdout = stdout_; stderr = stderr_; - if ((size_t)_EH_FRAME_BEGINS__ == (size_t)_EH_FRAME_OBJECTS__) - for (size_t i = 1; i <= (size_t)_EH_FRAME_BEGINS__; i++) - base->libc.__register_frame_info( - (&_EH_FRAME_BEGINS__)[i], - (&_EH_FRAME_OBJECTS__)[i]); + if ((size_t)_EH_FRAME_BEGINS__ != (size_t)_EH_FRAME_OBJECTS__) + return false; + + for (size_t i = 1; i <= (size_t)_EH_FRAME_BEGINS__; i++) + base->libc.__register_frame_info((&_EH_FRAME_BEGINS__)[i], + (&_EH_FRAME_OBJECTS__)[i]); iter0 = &__CTOR_LIST__[1]; for (iter = iter0; *iter != 0; iter++); while (iter > iter0) { @@ -260,10 +266,12 @@ void (*ctor)(void) = (void (*)(void))*--iter; ctor(); } base->initialized = true; + + return true; } void * malloc(size_t size) { @@ -309,15 +317,15 @@ return ret; } int -fputs(const char *restrict s, FILE *restrict stream) +fflush(FILE *restrict stream) { register struct ObjFWRTBase *base OBJC_M68K_REG("a6"); - return base->libc.fputs(s, stream); + return base->libc.fflush(stream); } void exit(int status) { Index: src/runtime/linklib/linklib.m ================================================================== --- src/runtime/linklib/linklib.m +++ src/runtime/linklib/linklib.m @@ -59,11 +59,11 @@ .malloc = malloc, .calloc = calloc, .realloc = realloc, .free = free, .vfprintf = vfprintf, - .fputs = fputs, + .fflush = fflush, .exit = exit, .abort = abort, ._Unwind_RaiseException = _Unwind_RaiseException, ._Unwind_DeleteException = _Unwind_DeleteException, ._Unwind_GetLanguageSpecificData = @@ -77,11 +77,15 @@ ._Unwind_SetGR = _Unwind_SetGR, ._Unwind_Resume = _Unwind_Resume, .__register_frame_info = __register_frame_info, .__deregister_frame_info = __deregister_frame_info, }; - objc_init(&libc, stdout, stderr); + + if (!objc_init(1, &libc, stdout, stderr)) { + fputs("Failed to initialize objfw_rt.library!\n", stderr); + abort(); + } initialized = true; } OF_DESTRUCTOR() Index: src/runtime/private.h ================================================================== --- src/runtime/private.h +++ src/runtime/private.h @@ -140,11 +140,11 @@ void *(*malloc)(size_t); void *(*calloc)(size_t, size_t); void *(*realloc)(void *, size_t); void (*free)(void *); int (*vfprintf)(FILE *, const char *, va_list); - int (*fputs)(const char *, FILE *); + int (*fflush)(FILE *); void (*exit)(int); void (*abort)(void); int (*_Unwind_RaiseException)(void *_Nonnull); void (*_Unwind_DeleteException)(void *_Nonnull); void *(*_Unwind_GetLanguageSpecificData)(void *_Nonnull); @@ -338,9 +338,10 @@ #define OBJC_ERROR(...) \ { \ fprintf(stderr, "[objc @ " __FILE__ ":%d] ", __LINE__); \ fprintf(stderr, __VA_ARGS__); \ - fputs("\n", stderr); \ + fprintf(stderr, "\n"); \ + fflush(stderr); \ abort(); \ OF_UNREACHABLE \ }