Create linked segments for main and engine

simplifying the linkerscript
This commit is contained in:
CrashOveride95
2021-03-27 21:12:27 -04:00
parent 756b21db88
commit 359ba19531
11 changed files with 42 additions and 124 deletions

View File

@@ -9,6 +9,7 @@ default: all
DEFINES :=
SRC_DIRS :=
MAINSEG_SRC_DIRS :=
#==============================================================================#
# Build Options #
@@ -175,7 +176,7 @@ $(eval $(call validate-option,UNF,0 1))
ifeq ($(UNF),1)
DEFINES += UNF=1
SRC_DIRS += src/usb
MAINSEG_SRC_DIRS += src/usb
endif
# HVQM - whether to use HVQM fmv library
@@ -185,7 +186,7 @@ HVQM ?= 0
$(eval $(call validate-option,HVQM,0 1))
ifeq ($(HVQM),1)
DEFINES += HVQM=1
SRC_DIRS += src/hvqm
MAINSEG_SRC_DIRS += src/hvqm
endif
# Whether to hide commands or not
@@ -271,7 +272,9 @@ ACTOR_DIR := actors
LEVEL_DIRS := $(patsubst levels/%,%,$(dir $(wildcard levels/*/header.h)))
# Directories containing source files
SRC_DIRS += src src/engine src/game src/audio src/menu src/buffers actors levels bin data assets asm lib sound
SRC_DIRS += src src/audio src/menu src/buffers actors levels bin data assets asm lib sound
MAINSEG_SRC_DIRS += src/game
ENGINE_SRC_DIRS := src/engine
LIBZ_SRC_DIRS := src/libz
BIN_DIRS := bin bin/$(VERSION)
@@ -281,6 +284,9 @@ include Makefile.split
# Source code files
LEVEL_C_FILES := $(wildcard levels/*/leveldata.c) $(wildcard levels/*/script.c) $(wildcard levels/*/geo.c)
C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) $(LEVEL_C_FILES)
MAINSEG_C_FILES := $(foreach dir,$(MAINSEG_SRC_DIRS),$(wildcard $(dir)/*.c))
MAINSEG_S_FILES := $(foreach dir,$(MAINSEG_SRC_DIRS),$(wildcard $(dir)/*.s))
ENGINE_C_FILES := $(foreach dir,$(ENGINE_SRC_DIRS),$(wildcard $(dir)/*.c))
LIBZ_C_FILES := $(foreach dir,$(LIBZ_SRC_DIRS),$(wildcard $(dir)/*.c))
S_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.s))
GENERATED_C_FILES := $(BUILD_DIR)/assets/mario_anim_data.c $(BUILD_DIR)/assets/demo_data.c
@@ -305,10 +311,12 @@ O_FILES := $(foreach file,$(C_FILES),$(BUILD_DIR)/$(file:.c=.o)) \
$(foreach file,$(GENERATED_C_FILES),$(file:.c=.o)) \
lib/PR/hvqm/hvqm2sp1.o lib/PR/hvqm/hvqm2sp2.o
MAINSEG_O_FILES := $(foreach file,$(MAINSEG_C_FILES),$(BUILD_DIR)/$(file:.c=.o)) $(foreach file,$(MAINSEG_S_FILES),$(BUILD_DIR)/$(file:.s=.o))
ENGINE_O_FILES := $(foreach file,$(ENGINE_C_FILES),$(BUILD_DIR)/$(file:.c=.o))
LIBZ_O_FILES := $(foreach file,$(LIBZ_C_FILES),$(BUILD_DIR)/$(file:.c=.o))
# Automatic dependency files
DEP_FILES := $(O_FILES:.o=.d) $(LIBZ_O_FILES:.o=.d) $(BUILD_DIR)/$(LD_SCRIPT).d
DEP_FILES := $(O_FILES:.o=.d) $(MAINSEG_O_FILES:.o=.d) $(ENGINE_O_FILES:.o=.d) $(LIBZ_O_FILES:.o=.d) $(BUILD_DIR)/$(LD_SCRIPT).d
#==============================================================================#
# Compiler Options #
@@ -502,7 +510,7 @@ $(BUILD_DIR)/src/usb/usb.o: CFLAGS += -Wno-unused-variable -Wno-sign-compare -Wn
$(BUILD_DIR)/src/usb/debug.o: OPT_FLAGS := -O0
$(BUILD_DIR)/src/usb/debug.o: CFLAGS += -Wno-unused-parameter -Wno-maybe-uninitialized
ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) $(GODDARD_SRC_DIRS) $(LIBZ_SRC_DIRS) $(ULTRA_BIN_DIRS) $(BIN_DIRS) $(TEXTURE_DIRS) $(TEXT_DIRS) $(SOUND_SAMPLE_DIRS) $(addprefix levels/,$(LEVEL_DIRS)) rsp include) $(YAY0_DIR) $(addprefix $(YAY0_DIR)/,$(VERSION)) $(SOUND_BIN_DIR) $(SOUND_BIN_DIR)/sequences/$(VERSION)
ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) $(MAINSEG_SRC_DIRS) $(GODDARD_SRC_DIRS) $(ENGINE_SRC_DIRS) $(LIBZ_SRC_DIRS) $(ULTRA_BIN_DIRS) $(BIN_DIRS) $(TEXTURE_DIRS) $(TEXT_DIRS) $(SOUND_SAMPLE_DIRS) $(addprefix levels/,$(LEVEL_DIRS)) rsp include) $(YAY0_DIR) $(addprefix $(YAY0_DIR)/,$(VERSION)) $(SOUND_BIN_DIR) $(SOUND_BIN_DIR)/sequences/$(VERSION)
# Make sure build directory exists before compiling anything
DUMMY != mkdir -p $(ALL_DIRS)
@@ -696,15 +704,25 @@ $(BUILD_DIR)/$(LD_SCRIPT): $(LD_SCRIPT)
$(call print,Preprocessing linker script:,$<,$@)
$(V)$(CPP) $(CPPFLAGS) -DBUILD_DIR=$(BUILD_DIR) -MMD -MP -MT $@ -MF $@.d -o $@ $<
# Link mainseg
$(BUILD_DIR)/mainseg.o: $(MAINSEG_O_FILES) $(BUILD_DIR)/libz.a
@$(PRINT) "$(GREEN)Linking main segment: $(BLUE)$@ $(NO_COL)\n"
$(V)$(LD) -o $@ -r $(MAINSEG_O_FILES) -L $(BUILD_DIR) -L$(LIBS_DIR) -Llib -lgcc -lnustd -lhvqm2 -lz
# Link engine
$(BUILD_DIR)/engineseg.o: $(ENGINE_O_FILES)
@$(PRINT) "$(GREEN)Linking engine segment: $(BLUE)$@ $(NO_COL)\n"
$(V)$(LD) -o $@ -r $(ENGINE_O_FILES)
# Link libz
$(BUILD_DIR)/libz.a: $(LIBZ_O_FILES)
@$(PRINT) "$(GREEN)Linking libz: $(BLUE)$@ $(NO_COL)\n"
$(V)$(AR) rcs -o $@ $(LIBZ_O_FILES)
# Link SM64 ELF file
$(ELF): $(O_FILES) $(YAY0_OBJ_FILES) $(SEG_FILES) $(BUILD_DIR)/$(LD_SCRIPT) undefined_syms.txt $(BUILD_DIR)/libz.a
$(ELF): $(BUILD_DIR)/mainseg.o $(BUILD_DIR)/engineseg.o $(O_FILES) $(YAY0_OBJ_FILES) $(SEG_FILES) $(BUILD_DIR)/$(LD_SCRIPT) undefined_syms.txt
@$(PRINT) "$(GREEN)Linking ELF file: $(BLUE)$@ $(NO_COL)\n"
$(V)$(LD) -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) -lultra_rom -Llib -lgcc -lnustd -lhvqm2 -lz
$(V)$(LD) -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$(BUILD_DIR)/src/audio -L$(LIBS_DIR) -lultra_rom
# Build ROM
$(ROM): $(ELF)

View File

@@ -261,7 +261,6 @@ $(BUILD_DIR)/bin/%_skybox.elf: SEGMENT_ADDRESS := 0x0A000000
# intro and ipl3 textures are not compressed
INTRO_RAW_FILES := $(wildcard $(TEXTURE_DIR)/intro_raw/*.png)
$(BUILD_DIR)/src/goddard/renderer.o: $(addprefix $(BUILD_DIR)/,$(patsubst %.png,%.inc.c,$(INTRO_RAW_FILES)))
IPL3_TEXTURE_FILES := $(wildcard $(TEXTURE_DIR)/ipl3_raw/*.png)
IPL3_RAW_FILES := $(addprefix $(BUILD_DIR)/,$(patsubst %.png,%,$(IPL3_TEXTURE_FILES)))

Binary file not shown.

133
sm64.ld
View File

@@ -102,17 +102,17 @@ SECTIONS
#ifdef HVQM
BEGIN_NOLOAD(hvqmwork)
{
BUILD_DIR/src/hvqm/hvqmwork.o(.bss*);
BUILD_DIR/src/buffers/hvqmwork.o(.bss*);
}
END_NOLOAD(hvqmwork)
BEGIN_NOLOAD(adpcmbuf)
{
BUILD_DIR/src/hvqm/adpcmbuf.o(.bss*);
BUILD_DIR/src/buffers/adpcmbuf.o(.bss*);
}
END_NOLOAD(adpcmbuf)
BEGIN_NOLOAD(hvqbuf)
{
BUILD_DIR/src/hvqm/hvqbuf.o(.bss*);
BUILD_DIR/src/buffers/hvqbuf.o(.bss*);
}
END_NOLOAD(hvqbuf)
@@ -123,107 +123,28 @@ SECTIONS
{
BUILD_DIR/asm/entry.o(.text);
BUILD_DIR/src/game*.o(.text);
#ifdef HVQM
BUILD_DIR/src/hvqm*.o(.text);
#endif
#ifdef UNF
BUILD_DIR/src/usb*.o(.text);
#endif
BUILD_DIR/mainseg.o(.text);
BUILD_DIR/src/audio*.o(.text);
#ifdef GZIP
BUILD_DIR/src/gzip*.o(.text);
#endif
#ifdef YAY0
BUILD_DIR/asm/slidec.o(.text);
#endif
#ifdef MIO0
BUILD_DIR/asm/decompress.o(.text);
#endif
#ifdef RNC1
BUILD_DIR/asm/rnc1.o(.text);
#endif
#ifdef RNC2
BUILD_DIR/asm/rnc2.o(.text);
#endif
*/libultra_rom.a:*.o(.text);
*/libnustd.a:*.o(.text);
*/libgcc.a:_umoddi3.o(.text);
*/libgcc.a:_udivdi3.o(.text);
*/libgcc.a:_divdi3.o(.text);
*/libgcc.a:_moddi3.o(.text);
*/libgcc.a:_fixdfdi.o(.text);
*/libgcc.a:_fixsfdi.o(.text);
*/libgcc.a:_fixunsfdi.o(.text);
*/libgcc.a:_fixunssfdi.o(.text);
*/libgcc.a:_fixunsdfdi.o(.text);
*/libgcc.a:_floatdidf.o(.text);
*/libgcc.a:_floatundidf.o(.text);
*/libgcc.a:_floatdisf.o(.text);
*/libgcc.a:_cmpdi2.o(.text);
#ifdef GZIP
*/libz.a:*.o(.text);
#endif
#ifdef HVQM
*/libhvqm2.a:*.o(.text);
#endif
BUILD_DIR/lib/rsp.o(.text);
lib/PR/hvqm/hvqm2sp1.o(.text);
/* data */
BUILD_DIR/src/game*.o(.data*);
BUILD_DIR/src/game*.o(.sdata*);
#ifdef UNF
BUILD_DIR/src/usb*.o(.data*);
BUILD_DIR/src/usb*.o(.sdata*);
#endif
BUILD_DIR/src/audio*.o(.data*);
BUILD_DIR/src/audio*.o(.sdata*);
#ifdef GZIP
BUILD_DIR/src/gzip*.o(.data*);
#endif
#ifdef RNC2
BUILD_DIR/asm/rnc2.o(.data*);
#endif
BUILD_DIR/mainseg.o(.*data*);
BUILD_DIR/src/audio*.o(.*data*);
*/libultra_rom.a:*.o(.*data*);
*/libultra_rom.a:*.o(.data*);
*/libultra_rom.a:*.o(.sdata*);
#ifdef HVQM
*/libhvqm2.a:*.o(.data*);
#endif
#ifdef GZIP
*/libz.a:*.o(.data*);
#endif
BUILD_DIR/lib/rsp.o(.data*);
#ifdef HVQM
lib/PR/hvqm/hvqm2sp1.o(.data*);
#endif
/* rodata */
BUILD_DIR/src/game*.o(.rodata*);
#ifdef UNF
BUILD_DIR/src/usb*.o(.rodata*);
#endif
BUILD_DIR/mainseg.o(.rodata*);
BUILD_DIR/src/audio*.o(.rodata*);
#ifdef GZIP
BUILD_DIR/src/gzip*.o(.rodata*);
#endif
*/libultra_rom.a:*.o(.rodata*);
*/libgcc.a:_umoddi3.o(.rodata*);
*/libgcc.a:_udivdi3.o(.rodata*);
*/libgcc.a:_divdi3.o(.rodata*);
*/libgcc.a:_clz.o(.rodata*);
*/libgcc.a:_fixunsdfdi.o(.rodata*);
*/libgcc.a:_floatundidf.o(.rodata*);
*/libgcc.a:_moddi3.o(.rodata*);
#ifdef HVQM
*/libhvqm2.a:*.o(.rodata*);
#endif
#ifdef GZIP
*/libz.a:*.o(.rodata*);
#endif
BUILD_DIR/lib/rsp.o(.rodata*);
#ifdef HVQM
lib/PR/hvqm/hvqm2sp1.o(.rodata*);
@@ -232,31 +153,11 @@ SECTIONS
END_SEG(main)
BEGIN_NOLOAD(main)
{
BUILD_DIR/src/game*.o(.bss*);
BUILD_DIR/src/game*.o(.sbss*);
#ifdef HVQM
BUILD_DIR/src/hvqm*.o(.bss*);
#endif
#ifdef UNF
BUILD_DIR/src/usb*.o(.bss*);
BUILD_DIR/src/usb*.o(.sbss*);
#endif
BUILD_DIR/src/audio*.o(.bss*);
BUILD_DIR/src/audio*.o(.sbss*);
#ifdef GZIP
BUILD_DIR/src/gzip*.o(.bss*);
#endif
BUILD_DIR/mainseg.o(.*bss*);
BUILD_DIR/src/audio*.o(.*bss*);
*/libultra_rom.a:*.o(COMMON);
*/libultra_rom.a:*.o(.scommon);
*/libultra_rom.a:*.o(.bss*);
*/libultra_rom.a:*.o(.sbss*);
#ifdef HVQM
*/libhvqm2.a:*.o(.bss*);
#endif
#ifdef GZIP
*/libz.a:*.o(.bss*);
#endif
*/libultra_rom.a:*.o(.*bss*);
. = ALIGN(0x8);
}
END_NOLOAD(main)
@@ -269,17 +170,17 @@ SECTIONS
BEGIN_SEG(engine, .)
{
BUILD_DIR/src/engine*.o(.text);
BUILD_DIR/engineseg.o(.text);
/* data */
BUILD_DIR/src/engine*.o(.data*);
BUILD_DIR/src/engine*.o(.sdata*);
BUILD_DIR/engineseg.o(.data*);
BUILD_DIR/engineseg.o(.sdata*);
/* rodata */
BUILD_DIR/src/engine*.o(.rodata*);
BUILD_DIR/engineseg.o(.rodata*);
}
END_SEG(engine)
BEGIN_NOLOAD(engine)
{
BUILD_DIR/src/engine*.o(.bss*);
BUILD_DIR/engineseg.o(.bss*);
. = ALIGN(0x100);
}
END_NOLOAD(engine)