Change the direct bl initSystem to a register-indirect call
f724cc370f added -ffunction-sections -fdata-sections and -Wl,--gc-sections to Makefile.ctr. While this saves ~160KB RAM by enabling dead code elimination, it has a side effect: every function now gets its own ELF section (e.g. initSystem goes into .text.initSystem). The linker is free to place these sections in any order, and with a large core like ScummVM, initSystem ends up >32MB from the .crt0 section at the start of the binary.
The ARM bl (branch-with-link) instruction at line 43 of 3dsx_custom_crt0.s only has a +/- 32MB range. When initSystem is beyond that range, the linker emits relocation truncated to fit: R_ARM_CALL.
This fix uses the same pattern already used for main (lines 52-54: ldr r3, =main; bx r3). The ldr r2, =initSystem loads the absolute address from a literal pool, and blx r2 branches to it with no range limitation. The bl ClearMem call is fine because ClearMem is defined locally within the .crt0 section.
While here:
* remove input_overlay and task_overlay from linking blacklist
* move -Werror to CC invocation since C++ refuses to use it
* copy the quiet build mode from the main Makefile and make it the
default
* temporarily define DEPRECATED for gpu_old.h to allow succesful build
* replace the call to command_event() with one to retroarch_main_quit()
in a failure case
* add missing uncompr.o in Makefile.common for HAVE_BUILTINZLIB
* unsigned vs signed comparison
* copy DEBUG_VAR from wiiu - this one prints pointer values in a
portable way
* prove GCC14 that a date formatted as "00/00/0000" can fit into 11
bytes
* explicitly mention previously unhandled enum constants
* Adding GFX widgets in b9849f78f7 and 1235a7435e orphaned
ctr_set_osd_msg(). Reinstate it instead of removing, since it's
effectively the same as calling font_driver_render_msg, but with
checks.
* remove sp from clobber list in inline assembly
Set USE_CTRULIB_2=1 to build with libctru 2.0. When unset, this code
is compatible with the older toolchain.
Some 2.0 changes addressed rare problems in earlier versions:
- Save / restore stack pointer for init / exit
Otherwise, it could be outside of the range we deallocate.
- Run aptMainLoop in the audio driver to react correctly to sleep events
Other changes for 2.0:
- Remove ninjhax1 -- requires outdated APIs that have been removed
- Switch from __sync_arbiter to syncArbitrateAddress
- Use implicit gxCmdBuf
- Use gpuPresentBuffer for double buffering
NOTE: I do not have the 3ds version of devkitARM installed so I could
not test it if moving the assets to pkg/ctr broke compiling but I did
change the assets paths in Makefile.ctr and Makefile.ctr.salimander so
it should compile.