@@ -9,6 +9,7 @@ N64_ROM_SAVETYPE = # Supported savetypes: none eeprom4k eeprom16 sram256k sram76
9
9
N64_ROM_RTC = # Set to true to enable the Joybus Real-Time Clock
10
10
N64_ROM_REGIONFREE = # Set to true to allow booting on any console region
11
11
N64_ROM_ELFCOMPRESS = 1 # Set compression level of ELF file in ROM
12
+ N64_ROM_DSOCOMPRESS ?= 1 # Set compression level of DSOs file in ROM
12
13
13
14
# Override this to use a toolchain installed separately from libdragon
14
15
N64_GCCPREFIX ?= $(N64_INST )
@@ -39,6 +40,9 @@ N64_SYM = $(N64_BINDIR)/n64sym
39
40
N64_ELFCOMPRESS = $(N64_BINDIR ) /n64elfcompress
40
41
N64_AUDIOCONV = $(N64_BINDIR ) /audioconv64
41
42
N64_MKSPRITE = $(N64_BINDIR ) /mksprite
43
+ N64_DSO = $(N64_BINDIR ) /n64dso
44
+ N64_DSOEXTERN = $(N64_BINDIR ) /n64dso-extern
45
+ N64_DSOMSYM = $(N64_BINDIR ) /n64dso-msym
42
46
43
47
N64_C_AND_CXX_FLAGS = -march=vr4300 -mtune=vr4300 -I$(N64_INCLUDEDIR )
44
48
N64_C_AND_CXX_FLAGS += -falign-functions=32 # NOTE: if you change this, also change backtrace() in backtrace.c
@@ -51,6 +55,7 @@ N64_CXXFLAGS = $(N64_C_AND_CXX_FLAGS) -std=gnu++17
51
55
N64_ASFLAGS = -mtune=vr4300 -march=vr4300 -Wa,--fatal-warnings -I$(N64_INCLUDEDIR )
52
56
N64_RSPASFLAGS = -march=mips1 -mabi=32 -Wa,--fatal-warnings -I$(N64_INCLUDEDIR )
53
57
N64_LDFLAGS = -g -L$(N64_LIBDIR ) -ldragon -lm -ldragonsys -Tn64.ld --gc-sections --wrap __do_global_ctors
58
+ N64_DSOLDFLAGS = --emit-relocs --unresolved-symbols=ignore-all --nmagic -T$(N64_LIBDIR ) /dso.ld
54
59
55
60
N64_TOOLFLAGS = --title $(N64_ROM_TITLE )
56
61
N64_ED64ROMCONFIGFLAGS = $(if $(N64_ROM_SAVETYPE ) ,--savetype $(N64_ROM_SAVETYPE ) )
@@ -90,9 +95,14 @@ RSPASFLAGS+=-MMD
90
95
@rm -f $@
91
96
DFS_FILE=" $( filter %.dfs, $^) " ; \
92
97
if [ -z " $$ DFS_FILE" ]; then \
93
- $(N64_TOOL ) $(N64_TOOLFLAGS ) --toc --output $@ --align 256 $< .stripped --align 8 $< .sym; \
98
+ $(N64_TOOL ) $(N64_TOOLFLAGS ) --toc --output $@ --align 256 $< .stripped --align 8 $< .sym --align 8 ; \
94
99
else \
95
- $(N64_TOOL ) $(N64_TOOLFLAGS ) --toc --output $@ --align 256 $< .stripped --align 8 $< .sym --align 16 " $$ DFS_FILE" ; \
100
+ MSYM_FILE=" $( filter %.msym, $^) " ; \
101
+ if [ -z " $$ MSYM_FILE" ]; then \
102
+ $(N64_TOOL ) $(N64_TOOLFLAGS ) --toc --output $@ --align 256 $< .stripped --align 8 $< .sym --align 16 " $$ DFS_FILE" ; \
103
+ else \
104
+ $(N64_TOOL ) $(N64_TOOLFLAGS ) --toc --output $@ --align 256 $< .stripped --align 8 $< .sym --align 8 " $$ MSYM_FILE" --align 16 " $$ DFS_FILE" ; \
105
+ fi \
96
106
fi
97
107
if [ ! -z " $( strip $( N64_ED64ROMCONFIGFLAGS) ) " ]; then \
98
108
$(N64_ED64ROMCONFIG ) $(N64_ED64ROMCONFIGFLAGS ) $@ ; \
@@ -157,11 +167,47 @@ $(BUILD_DIR)/%.o: $(SOURCE_DIR)/%.cpp
157
167
% .elf : $(N64_LIBDIR ) /libdragon.a $(N64_LIBDIR ) /libdragonsys.a $(N64_LIBDIR ) /n64.ld
158
168
@mkdir -p $(dir $@ )
159
169
@echo " [LD] $@ "
160
- # We always use g++ to link except for ucode because of the inconsistencies
170
+ # We always use g++ to link except for ucode and DSO files because of the inconsistencies
161
171
# between ld when it comes to global ctors dtors. Also see __do_global_ctors
162
- $(CXX) -o $@ $(filter-out $(N64_LIBDIR)/n64.ld,$^) -lc $(patsubst %,-Wl$(COMMA)%,$(LDFLAGS)) -Wl,-Map=$(BUILD_DIR)/$(notdir $(basename $@)).map
172
+ EXTERNS_FILE="$(filter %.externs, $^)"; \
173
+ if [ -z "$$EXTERNS_FILE" ]; then \
174
+ $(CXX) -o $@ $(filter %.o, $^) $(filter-out $(N64_LIBDIR)/libdragon.a $(N64_LIBDIR)/libdragonsys.a, $(filter %.a, $^)) \
175
+ -lc $(patsubst %,-Wl$(COMMA)%,$(LDFLAGS)) -Wl,-Map=$(BUILD_DIR)/$(notdir $(basename $@)).map; \
176
+ else \
177
+ $(CXX) -o $@ $(filter %.o, $^) $(filter-out $(N64_LIBDIR)/libdragon.a $(N64_LIBDIR)/libdragonsys.a, $(filter %.a, $^)) \
178
+ -lc $(patsubst %,-Wl$(COMMA)%,$(LDFLAGS)) -Wl,-T"$$EXTERNS_FILE" -Wl,-Map=$(BUILD_DIR)/$(notdir $(basename $@)).map; \
179
+ fi
163
180
$(N64_SIZE) -G $@
164
181
182
+
183
+ # Change all the dependency chain of DSO files to use the N64 toolchain.
184
+ % .dso : CC=$(N64_CC )
185
+ % .dso : CXX=$(N64_CXX )
186
+ % .dso : AS=$(N64_AS )
187
+ % .dso : LD=$(N64_LD )
188
+ % .dso : CFLAGS+=$(N64_CFLAGS ) -mno-gpopt -DN64_DSO $(DSO_CFLAGS )
189
+ % .dso : CXXFLAGS+=$(N64_CXXFLAGS ) -mno-gpopt -DN64_DSO $(DSO_CXXFLAGS )
190
+ % .dso : ASFLAGS+=$(N64_ASFLAGS )
191
+ % .dso : RSPASFLAGS+=$(N64_RSPASFLAGS )
192
+
193
+ % .dso : $(N64_LIBDIR ) /dso.ld
194
+ $(eval DSO_ELF=$(basename $(BUILD_DIR ) /dso_elf/$@ ) .elf)
195
+ @mkdir -p $(dir $@ )
196
+ @mkdir -p $(dir $(DSO_ELF ) )
197
+ @echo " [DSO] $@ "
198
+ $(N64_LD ) $(N64_DSOLDFLAGS ) -Map=$(basename $(DSO_ELF ) ) .map -o $(DSO_ELF ) $(filter % .o, $^ )
199
+ $(N64_SIZE ) -G $(DSO_ELF )
200
+ $(N64_DSO ) -o $(dir $@ ) -c $(N64_ROM_DSOCOMPRESS ) $(DSO_ELF )
201
+ $(N64_SYM ) $(DSO_ELF ) $@ .sym
202
+
203
+ % .externs :
204
+ @echo " [DSOEXTERN] $@ "
205
+ $(N64_DSOEXTERN ) -o $@ $^
206
+
207
+ % .msym : % .elf
208
+ @echo " [MSYM] $@ "
209
+ $(N64_DSOMSYM ) $< $@
210
+
165
211
ifneq ($(V ) ,1)
166
212
.SILENT :
167
213
endif
0 commit comments