SS2: Goddard size now successfully passed to linker

This commit is contained in:
someone2639
2021-08-13 15:14:01 -04:00
parent d47ba26444
commit 3c46090218
4 changed files with 5173 additions and 44 deletions

View File

@@ -753,7 +753,7 @@ $(BUILD_DIR)/rsp/%.bin $(BUILD_DIR)/rsp/%_data.bin: rsp/%.s
$(V)$(RSPASM) -sym $@.sym $(RSPASMFLAGS) -strequ CODE_FILE $(BUILD_DIR)/rsp/$*.bin -strequ DATA_FILE $(BUILD_DIR)/rsp/$*_data.bin $<
# Run linker script through the C preprocessor
$(BUILD_DIR)/$(LD_SCRIPT): $(LD_SCRIPT)
$(BUILD_DIR)/$(LD_SCRIPT): $(LD_SCRIPT) $(BUILD_DIR)/goddard.txt
$(call print,Preprocessing linker script:,$<,$@)
$(V)$(CPP) $(CPPFLAGS) -DBUILD_DIR=$(BUILD_DIR) -MMD -MP -MT $@ -MF $@.d -o $@ $<
@@ -767,10 +767,23 @@ $(BUILD_DIR)/libz.a: $(LIBZ_O_FILES)
@$(PRINT) "$(GREEN)Linking libz: $(BLUE)$@ $(NO_COL)\n"
$(V)$(AR) rcs -o $@ $(LIBZ_O_FILES)
# SS2: Goddard rules to get size
$(BUILD_DIR)/goddard.ld: goddard.ld
$(call print,Preprocessing linker script:,$<,$@)
$(V)$(CPP) $(CPPFLAGS) -DBUILD_DIR=$(BUILD_DIR) -MMD -MP -MT $@ -MF $@.d -o $@ $<
$(BUILD_DIR)/goddard.elf: $(BUILD_DIR)/goddard.ld
@$(PRINT) "$(GREEN)Linking ELF file: $(BLUE)$@ $(NO_COL)\n"
$(V)$(LD) --gc-sections -L $(BUILD_DIR) -T undefined_syms.txt -T $< -Map $(BUILD_DIR)/goddard.map --no-check-sections -o $@ -T tools/hardcoded_syms.txt $(wildcard $(BUILD_DIR)/src/menu/*.o) -L$(LIBS_DIR) -l$(ULTRALIB) -Llib $(LINK_LIBRARIES) -u sprintf -u osMapTLB -Llib/gcclib/$(LIBGCCDIR) -lgcc
$(BUILD_DIR)/goddard.txt: $(BUILD_DIR)/goddard.elf
$(call print,Getting Goddard size...)
$(V)python3 tools/getGoddardSize.py $(BUILD_DIR)/goddard.map
# Link SM64 ELF file
$(ELF): $(O_FILES) $(YAY0_OBJ_FILES) $(SEG_FILES) $(BUILD_DIR)/$(LD_SCRIPT) undefined_syms.txt $(BUILD_DIR)/libz.a $(BUILD_DIR)/libgoddard.a
@$(PRINT) "$(GREEN)Linking ELF file: $(BLUE)$@ $(NO_COL)\n"
$(V)$(LD) --gc-sections -L $(BUILD_DIR) -T undefined_syms.txt -T $(BUILD_DIR)/$(LD_SCRIPT) -Map $(BUILD_DIR)/sm64.$(VERSION).map --no-check-sections $(addprefix -R ,$(SEG_FILES)) -o $@ $(O_FILES) -L$(LIBS_DIR) -l$(ULTRALIB) -Llib $(LINK_LIBRARIES) -u sprintf -u osMapTLB -Llib/gcclib/$(LIBGCCDIR) -lgcc
$(V)$(LD) --gc-sections -L $(BUILD_DIR) -T undefined_syms.txt -T $(BUILD_DIR)/$(LD_SCRIPT) -T goddard.txt -Map $(BUILD_DIR)/sm64.$(VERSION).map --no-check-sections $(addprefix -R ,$(SEG_FILES)) -o $@ $(O_FILES) -L$(LIBS_DIR) -l$(ULTRALIB) -Llib $(LINK_LIBRARIES) -u sprintf -u osMapTLB -Llib/gcclib/$(LIBGCCDIR) -lgcc
# Build ROM
$(ROM): $(ELF)

View File

@@ -1,3 +1,10 @@
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; \
@@ -16,46 +23,52 @@
_##name##SegmentBssEnd = ADDR(.name.noload) + SIZEOF(.name.noload); \
_##name##SegmentBssSize = SIZEOF(.name.noload);
BEGIN_NOLOAD(goddard_sz)
{
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
. = ALIGN(16);
BUILD_DIR/src/menu*.o(.bss*);
#ifdef KEEP_MARIO_HEAD
BUILD_DIR/libgoddard.a:*.o(.bss*);
#endif
. = ALIGN(16);
}
END_NOLOAD(goddard_sz)
SECTIONS {
__romPos = 0;
BEGIN_SEG(goddard_sz, 0x80345678)
{
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);
}
END_SEG(goddard_sz)
GODDARD_SIZE = SIZEOF(.goddard_sz.noload);
GODDARD_SIZE = SIZEOF(.goddard_sz);
/DISCARD/ :
{
*(*);
}
}

12
tools/getGoddardSize.py Normal file
View File

@@ -0,0 +1,12 @@
import sys, os
with open(sys.argv[1]) as f:
for line in f:
if "GODDARD_SIZE" in line:
tokens=line.split()
print(tokens)
with open("build/us/goddard.txt", "w+") as f:
sz = int(tokens[0], 16)
sz &= 0xFFFFFFF0
f.write("GODDARD_SIZE = 0x%X;" % sz)

5091
tools/hardcoded_syms.txt Normal file

File diff suppressed because it is too large Load Diff