diff --git a/goddard.ld b/goddard.ld index 37f89cc6..46b4e8bd 100644 --- a/goddard.ld +++ b/goddard.ld @@ -1,10 +1,5 @@ OUTPUT_ARCH (mips) -#define LINKER /* Removes externs from preprocessed script */ -#include "segments.h" -#include "config.h" -#undef LINKER - #define BEGIN_SEG(name, addr) \ _##name##SegmentStart = ADDR(.name); \ _##name##SegmentRomStart = __romPos; \ @@ -25,47 +20,22 @@ OUTPUT_ARCH (mips) SECTIONS { __romPos = 0; - BEGIN_SEG(goddard_sz, 0x80345678) + SEG_GODDARD = 0x80345670; + BEGIN_SEG(goddard, SEG_GODDARD) { - KEEP(BUILD_DIR/src/menu*.o(.text)); - KEEP(BUILD_DIR/src/menu*.o(.data*)); - KEEP(BUILD_DIR/src/menu*.o(.rodata*)); - #ifdef KEEP_MARIO_HEAD - KEEP(BUILD_DIR/libgoddard.a:*.o(.text)); - KEEP(BUILD_DIR/libgoddard.a:gd_main.o(.data*)); - KEEP(BUILD_DIR/libgoddard.a:draw_objects.o(.data*)); - KEEP(BUILD_DIR/libgoddard.a:objects.o(.data*)); - KEEP(BUILD_DIR/libgoddard.a:particles.o(.data*)); - KEEP(BUILD_DIR/libgoddard.a:dynlist_proc.o(.data*)); - KEEP(BUILD_DIR/libgoddard.a:debug_utils.o(.data*)); - KEEP(BUILD_DIR/libgoddard.a:joints.o(.data*)); - KEEP(BUILD_DIR/libgoddard.a:shape_helper.o(.data*)); - KEEP(BUILD_DIR/libgoddard.a:renderer.o(.data*)); - KEEP(BUILD_DIR/libgoddard.a:gd_main.o(.rodata*)); - KEEP(BUILD_DIR/libgoddard.a:gd_memory.o(.rodata*)); - KEEP(BUILD_DIR/libgoddard.a:draw_objects.o(.rodata*)); - KEEP(BUILD_DIR/libgoddard.a:objects.o(.rodata*)); - KEEP(BUILD_DIR/libgoddard.a:skin_movement.o(.rodata*)); - KEEP(BUILD_DIR/libgoddard.a:particles.o(.rodata*)); - KEEP(BUILD_DIR/libgoddard.a:dynlist_proc.o(.rodata*)); - KEEP(BUILD_DIR/libgoddard.a:old_menu.o(.rodata*)); - KEEP(BUILD_DIR/libgoddard.a:debug_utils.o(.rodata*)); - KEEP(BUILD_DIR/libgoddard.a:joints.o(.rodata*)); - KEEP(BUILD_DIR/libgoddard.a:skin.o(.rodata*)); - KEEP(BUILD_DIR/libgoddard.a:gd_math.o(.rodata*)); - KEEP(BUILD_DIR/libgoddard.a:shape_helper.o(.rodata*)); - KEEP(BUILD_DIR/libgoddard.a:renderer.o(.rodata*)); - #endif - . = ALIGN(16); - KEEP(BUILD_DIR/src/menu*.o(.bss*)); - #ifdef KEEP_MARIO_HEAD - KEEP(BUILD_DIR/libgoddard.a:*.o(.bss*)); - #endif - . = ALIGN(16); + #define LOAD + #include "goddard.ld.inc" + #undef LOAD } - END_SEG(goddard_sz) + END_SEG(goddard) + BEGIN_NOLOAD(goddard) { + #define NOLOAD + #include "goddard.ld.inc" + #undef NOLOAD + } + END_NOLOAD(goddard) - GODDARD_SIZE = SIZEOF(.goddard_sz); + GODDARD_SIZE = SIZEOF(.goddard) + SIZEOF(.goddard.noload); /DISCARD/ : { diff --git a/goddard.ld.inc b/goddard.ld.inc new file mode 100644 index 00000000..acb4316f --- /dev/null +++ b/goddard.ld.inc @@ -0,0 +1,43 @@ +#ifdef LOAD + KEEP(BUILD_DIR/src/menu*.o(.text)); + KEEP(BUILD_DIR/src/menu*.o(.data*)); + KEEP(BUILD_DIR/src/menu*.o(.rodata*)); +#ifdef KEEP_MARIO_HEAD + KEEP(BUILD_DIR/libgoddard.a:*.o(.text)); + KEEP(BUILD_DIR/libgoddard.a:gd_main.o(.data*)); + KEEP(BUILD_DIR/libgoddard.a:draw_objects.o(.data*)); + KEEP(BUILD_DIR/libgoddard.a:objects.o(.data*)); + KEEP(BUILD_DIR/libgoddard.a:particles.o(.data*)); + KEEP(BUILD_DIR/libgoddard.a:dynlist_proc.o(.data*)); + KEEP(BUILD_DIR/libgoddard.a:debug_utils.o(.data*)); + KEEP(BUILD_DIR/libgoddard.a:joints.o(.data*)); + KEEP(BUILD_DIR/libgoddard.a:shape_helper.o(.data*)); + KEEP(BUILD_DIR/libgoddard.a:renderer.o(.data*)); + KEEP(BUILD_DIR/libgoddard.a:gd_main.o(.rodata*)); + KEEP(BUILD_DIR/libgoddard.a:gd_memory.o(.rodata*)); + KEEP(BUILD_DIR/libgoddard.a:draw_objects.o(.rodata*)); + KEEP(BUILD_DIR/libgoddard.a:objects.o(.rodata*)); + KEEP(BUILD_DIR/libgoddard.a:skin_movement.o(.rodata*)); + KEEP(BUILD_DIR/libgoddard.a:particles.o(.rodata*)); + KEEP(BUILD_DIR/libgoddard.a:dynlist_proc.o(.rodata*)); + KEEP(BUILD_DIR/libgoddard.a:old_menu.o(.rodata*)); + KEEP(BUILD_DIR/libgoddard.a:debug_utils.o(.rodata*)); + KEEP(BUILD_DIR/libgoddard.a:joints.o(.rodata*)); + KEEP(BUILD_DIR/libgoddard.a:skin.o(.rodata*)); + KEEP(BUILD_DIR/libgoddard.a:gd_math.o(.rodata*)); + KEEP(BUILD_DIR/libgoddard.a:shape_helper.o(.rodata*)); + KEEP(BUILD_DIR/libgoddard.a:renderer.o(.rodata*)); +#endif + . = ALIGN(16); +#endif + + + +#ifdef NOLOAD + KEEP(BUILD_DIR/src/menu*.o(.bss*)); +#ifdef KEEP_MARIO_HEAD + KEEP(BUILD_DIR/libgoddard.a:*.o(.bss*)); +#endif + . = ALIGN(16); +#endif + diff --git a/sm64.ld b/sm64.ld index 7a4fd197..5b6ed8a6 100755 --- a/sm64.ld +++ b/sm64.ld @@ -300,45 +300,16 @@ SECTIONS /* 0x8016F000 21D7D0-255EC0 [386F0] */ BEGIN_SEG(goddard, RAM_END - GODDARD_SIZE) { - BUILD_DIR/src/menu*.o(.text); - BUILD_DIR/src/menu*.o(.data*); - BUILD_DIR/src/menu*.o(.rodata*); -#ifdef KEEP_MARIO_HEAD - BUILD_DIR/libgoddard.a:*.o(.text); - /* goddard subsystem data */ - BUILD_DIR/libgoddard.a:gd_main.o(.data*); - BUILD_DIR/libgoddard.a:draw_objects.o(.data*); - BUILD_DIR/libgoddard.a:objects.o(.data*); - BUILD_DIR/libgoddard.a:particles.o(.data*); - BUILD_DIR/libgoddard.a:dynlist_proc.o(.data*); - BUILD_DIR/libgoddard.a:debug_utils.o(.data*); - BUILD_DIR/libgoddard.a:joints.o(.data*); - BUILD_DIR/libgoddard.a:shape_helper.o(.data*); - BUILD_DIR/libgoddard.a:renderer.o(.data*); - /* goddard subsystem rodata */ - BUILD_DIR/libgoddard.a:gd_main.o(.rodata*); - BUILD_DIR/libgoddard.a:gd_memory.o(.rodata*); - BUILD_DIR/libgoddard.a:draw_objects.o(.rodata*); - BUILD_DIR/libgoddard.a:objects.o(.rodata*); - BUILD_DIR/libgoddard.a:skin_movement.o(.rodata*); - BUILD_DIR/libgoddard.a:particles.o(.rodata*); - BUILD_DIR/libgoddard.a:dynlist_proc.o(.rodata*); - BUILD_DIR/libgoddard.a:old_menu.o(.rodata*); - BUILD_DIR/libgoddard.a:debug_utils.o(.rodata*); - BUILD_DIR/libgoddard.a:joints.o(.rodata*); - BUILD_DIR/libgoddard.a:skin.o(.rodata*); - BUILD_DIR/libgoddard.a:gd_math.o(.rodata*); - BUILD_DIR/libgoddard.a:shape_helper.o(.rodata*); - BUILD_DIR/libgoddard.a:renderer.o(.rodata*); -#endif + #define LOAD + #include "goddard.ld.inc" + #undef LOAD } END_SEG(goddard) BEGIN_NOLOAD(goddard) { - BUILD_DIR/src/menu*.o(.bss*); -#ifdef KEEP_MARIO_HEAD - BUILD_DIR/libgoddard.a:*.o(.bss*); -#endif + #define NOLOAD + #include "goddard.ld.inc" + #undef NOLOAD } END_NOLOAD(goddard) diff --git a/tools/getGoddardSize.py b/tools/getGoddardSize.py index fec2df8e..c1425ac7 100644 --- a/tools/getGoddardSize.py +++ b/tools/getGoddardSize.py @@ -7,6 +7,7 @@ with open(sys.argv[1]) as f: print(tokens) with open("build/us/goddard.txt", "w+") as f: sz = int(tokens[0], 16) + sz += 16 sz &= 0xFFFFFFF0 f.write("GODDARD_SIZE = 0x%X;" % sz) \ No newline at end of file