diff --git a/Makefile.wiiu b/Makefile.wiiu index 1ee2552b4e..2d0f70182a 100644 --- a/Makefile.wiiu +++ b/Makefile.wiiu @@ -1,5 +1,6 @@ TARGET := retroarch_wiiu -RPX_BUILD = 0 +BUILD_HBL_ELF = 1 +BUILD_RPX = 1 DEBUG = 0 GRIFFIN_BUILD = 0 WHOLE_ARCHIVE_LINK = 0 @@ -14,13 +15,6 @@ OBJ += wiiu/fs/sd_fat_devoptab.o OBJ += wiiu/fs/fs_utils.o OBJ += wiiu/tex_shader.o -ifeq ($(RPX_BUILD), 1) -OBJ += wiiu/system/stubs_rpl.o -else -OBJ += wiiu/system/dynamic.o -OBJ += wiiu/system/stubs_elf.o -endif - DEFINES := ifeq ($(GRIFFIN_BUILD), 1) @@ -142,29 +136,33 @@ ifeq ($(WHOLE_ARCHIVE_LINK), 1) endif CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -ifeq ($(RPX_BUILD), 1) - CFLAGS += -fno-builtin -ffreestanding -DRPX_BUILD - LIBDIRS += -L$(WUT_ROOT)/lib -L$(DEVKITPPC)/lib - LDFLAGS += -pie -fPIE - LDFLAGS += -z common-page-size=64 -z max-page-size=64 - LDFLAGS += -T $(WUT_ROOT)/rules/rpl.ld -# LDFLAGS += -T wiiu/link_rpl.ld - LDFLAGS += -nostartfiles - -else - LDFLAGS += -T wiiu/link_elf.ld -endif - LDFLAGS += -Wl,--gc-sections LIBS := $(WHOLE_START) -lretro_wiiu $(WHOLE_END) -lm -ifeq ($(RPX_BUILD), 1) -all: $(TARGET).elf $(TARGET).rpx -else -all: $(TARGET).elf + +RPX_OBJ = wiiu/system/stubs_rpl.o +HBL_ELF_OBJ = wiiu/system/dynamic.o wiiu/system/stubs_elf.o + +RPX_LDFLAGS := -L$(WUT_ROOT)/lib -L$(DEVKITPPC)/lib +RPX_LDFLAGS += -pie -fPIE +RPX_LDFLAGS += -z common-page-size=64 -z max-page-size=64 +RPX_LDFLAGS += -T wiiu/link_rpl.ld +RPX_LDFLAGS += -nostartfiles + +HBL_ELF_LDFLAGS := -T wiiu/link_elf.ld + +TARGETS := +ifeq ($(BUILD_RPX), 1) +TARGETS += $(TARGET).rpx endif +ifeq ($(BUILD_HBL_ELF), 1) +TARGETS += $(TARGET).elf +endif + +all: $(TARGETS) + %.o: %.cpp $(CXX) -c -o $@ $< $(CXXFLAGS) $(INCDIRS) @@ -180,15 +178,21 @@ endif %.a: $(AR) -rc $@ $^ -$(TARGET).elf: $(OBJ) libretro_wiiu.a wiiu/link_elf.ld wiiu/link_rpl.ld - $(LD) $(OBJ) $(LDFLAGS) $(LIBDIRS) $(LIBS) -o $@ +$(TARGET).elf: $(OBJ) $(HBL_ELF_OBJ) libretro_wiiu.a wiiu/link_elf.ld + $(LD) $(OBJ) $(HBL_ELF_OBJ) $(LDFLAGS) $(HBL_ELF_LDFLAGS) $(LIBDIRS) $(LIBS) -o $@ -%.rpx: %.elf +$(TARGET).rpx.elf: $(OBJ) $(RPX_OBJ) libretro_wiiu.a wiiu/link_elf.ld + $(LD) $(OBJ) $(RPX_OBJ) $(LDFLAGS) $(RPX_LDFLAGS) $(LIBDIRS) $(LIBS) -o $@ + +$(TARGET).rpx: $(TARGET).rpx.elf $(ELF2RPL) $(notdir $<) $@ clean: rm -f $(OBJ) + rm -f $(RPX_OBJ) + rm -f $(HBL_ELF_OBJ) rm -f $(TARGET).elf + rm -f $(TARGET).rpx.elf rm -f $(TARGET).rpx .PHONY: clean all diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c index f54d427cb3..85662c5efe 100644 --- a/frontend/drivers/platform_wiiu.c +++ b/frontend/drivers/platform_wiiu.c @@ -273,6 +273,8 @@ int main(int argc, char **argv) DEBUG_STR(argv[0]); DEBUG_STR(argv[1]); fflush(stdout); + +#if 1 #if 0 int argc_ = 2; // char* argv_[] = {WIIU_SD_PATH "retroarch/retroarch.elf", WIIU_SD_PATH "rom.nes", NULL}; @@ -296,6 +298,7 @@ int main(int argc, char **argv) }while(1); main_exit(NULL); +#endif fflush(stdout); fflush(stderr); ProcUIShutdown(); @@ -316,8 +319,26 @@ void __eabi() } -void __init(); -void __fini(); +__attribute__((weak)) +void __init(void) +{ + extern void(*__CTOR_LIST__[])(void); + void(**ctor)(void) = __CTOR_LIST__; + while(*ctor) + (*ctor++)(); +} + + +__attribute__((weak)) +void __fini(void) +{ + extern void(*__DTOR_LIST__[])(void); + void(**ctor)(void) = __DTOR_LIST__; + while(*ctor) + (*ctor++)(); +} + +/* HBL elf entry point */ int __entry_menu(int argc, char **argv) { InitFunctionPointers(); @@ -333,15 +354,16 @@ int __entry_menu(int argc, char **argv) return ret; } +/* RPX entry point */ __attribute__((noreturn)) void _start(int argc, char **argv) { memoryInitialize(); mount_sd_fat("sd"); -// __init(); + __init(); int ret = main(argc, argv); -// __fini(); + __fini(); unmount_sd_fat("sd"); memoryRelease(); diff --git a/wiiu/link_rpl.ld b/wiiu/link_rpl.ld index e0681df7ee..28caadbc60 100644 --- a/wiiu/link_rpl.ld +++ b/wiiu/link_rpl.ld @@ -112,18 +112,22 @@ SECTIONS { .ctors ALIGN(256) : { + __CTOR_LIST__ = .; KEEP (*crtbegin.o(.ctors)) /* MUST be first -- GCC requires it */ KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) + __CTOR_END__ = .; } : hdr_data .dtors ALIGN(256) : { + __DTOR_LIST__ = .; KEEP (*crtbegin.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) + __DTOR_END__ = .; } : hdr_data __bss_start__ = .;