Split up the ARM9 code and data sections (#883)

* Split up the ARM9 code (.text, .vectors) and data (.rodata, .data, .bss) sections into their own ELFs.

This allows us to use more ARM9 WRAM while leaving the 128k BootROM mirror intact.

* use the makefile definition

* Also dump section headers on .dis file
This commit is contained in:
Wolfvak 2025-03-15 10:25:23 -03:00 committed by GitHub
parent 61c79e3e3f
commit 50270a820c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 32 additions and 13 deletions

1
.gitignore vendored
View File

@ -5,6 +5,7 @@
*.obj
*.elf
*.map
*.dis
# Precompiled Headers
*.gch

View File

@ -52,7 +52,7 @@ export CFLAGS := -DDBUILTS="\"$(DBUILTS)\"" -DDBUILTL="\"$(DBUILTL)\"" -DVERSIO
-fomit-frame-pointer -ffast-math -std=gnu11 -MMD -MP \
-Wno-unused-function -Wno-format-truncation -Wno-format-nonliteral $(INCLUDE) -ffunction-sections -fdata-sections
export LDFLAGS := -Tlink.ld -nostartfiles -Wl,--gc-sections,-z,max-page-size=4096
ELF := arm9/arm9.elf arm11/arm11.elf
ELF := arm9/arm9_code.elf arm9/arm9_data.elf arm11/arm11.elf
.PHONY: all firm $(VRAM_TAR) elf release clean
all: firm
@ -104,9 +104,13 @@ $(TRF_FOLDER)/%.trf: $(JSON_FOLDER)/%.json
%.elf: .FORCE
@echo "Building $@"
@$(MAKE) --no-print-directory -C $(@D)
@$(MAKE) --no-print-directory -C $(@D) $(@F)
arm9/arm9.elf: $(VRAM_TAR) $(LANGUAGE_INL)
# Indicate a few explicit dependencies:
# The ARM9 data section depends on the VRAM drive
arm9/arm9_data.elf: $(VRAM_TAR) $(LANGUAGE_INL)
# And the code section depends on the data section being built already
arm9/arm9_code.elf: arm9/arm9_data.elf
firm: $(ELF) $(TRF_FILES)
@mkdir -p $(call dirname,"$(FIRM)") $(call dirname,"$(FIRMD)")
@ -114,9 +118,9 @@ firm: $(ELF) $(TRF_FILES)
@echo "[VERSION] $(VERSION)"
@echo "[BUILD] $(DBUILTL)"
@echo "[FIRM] $(FIRM)"
@$(PY3) -m firmtool build $(FIRM) $(FTFLAGS) -g -D $(ELF) -C NDMA XDMA
@$(PY3) -m firmtool build $(FIRM) $(FTFLAGS) -g -D $(ELF) -C NDMA NDMA XDMA
@echo "[FIRM] $(FIRMD)"
@$(PY3) -m firmtool build $(FIRMD) $(FTDFLAGS) -g -D $(ELF) -C NDMA XDMA
@$(PY3) -m firmtool build $(FIRMD) $(FTDFLAGS) -g -D $(ELF) -C NDMA NDMA XDMA
vram0: $(VRAM_TAR) .FORCE # legacy target name

View File

@ -11,11 +11,12 @@ all: $(TARGET).elf
.PHONY: clean
clean:
@rm -rf $(BUILD) $(TARGET).elf $(TARGET).map
@rm -rf $(BUILD) $(TARGET).elf $(TARGET).dis $(TARGET).map
$(TARGET).elf: $(OBJECTS) $(OBJECTS_COMMON)
@mkdir -p "$(@D)"
@$(CC) $(LDFLAGS) $^ -o $@
@$(OBJDUMP) -S -h $@ > $@.dis
$(BUILD)/%.cmn.o: $(COMMON_DIR)/%.c
@mkdir -p "$(@D)"

View File

@ -1,3 +1,4 @@
export OBJDUMP := arm-none-eabi-objdump
dirname = $(shell dirname $(1))

View File

@ -15,3 +15,9 @@ LDFLAGS += $(SUBARCH) -Wl,--use-blx,-Map,$(TARGET).map -flto
include ../Makefile.common
include ../Makefile.build
arm9_data.elf: arm9.elf
$(OBJCOPY) -O elf32-littlearm -j .rodata* -j .data* -j .bss* $< $@
arm9_code.elf: arm9.elf
$(OBJCOPY) -O elf32-littlearm -j .text* -j .vectors* $< $@

View File

@ -5,7 +5,9 @@ ENTRY(_start)
MEMORY
{
VECTORS (RX) : ORIGIN = 0x08000000, LENGTH = 64
AHBWRAM (RWX) : ORIGIN = 0x08000040, LENGTH = 512K - 64
CODEMEM (RX) : ORIGIN = 0x08000040, LENGTH = 512K - 64
BOOTROM (R) : ORIGIN = 0x08080000, LENGTH = 128K /* BootROM mirrors, don't touch! */
DATAMEM (RW) : ORIGIN = 0x080A0000, LENGTH = 384K
}
SECTIONS
@ -16,7 +18,7 @@ SECTIONS
KEEP(*(.vectors));
. = ALIGN(4);
__vectors_len = ABSOLUTE(.) - __vectors_vma;
} >VECTORS AT>AHBWRAM
} >VECTORS AT>CODEMEM
.text : ALIGN(4) {
__text_s = ABSOLUTE(.);
@ -24,24 +26,28 @@ SECTIONS
*(.text*);
. = ALIGN(4);
__text_e = ABSOLUTE(.);
} >AHBWRAM
} >CODEMEM
.rodata : ALIGN(4) {
*(.rodata*);
. = ALIGN(4);
} >AHBWRAM
__exidx_start = .;
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
__exidx_end = .;
. = ALIGN(4);
} >DATAMEM
.data : ALIGN(4) {
*(.data*);
. = ALIGN(4);
} >AHBWRAM
} >DATAMEM
.bss : ALIGN(4) {
.bss (NOLOAD) : ALIGN(4) {
__bss_start = .;
*(.bss*);
. = ALIGN(4);
__bss_end = .;
} >AHBWRAM
} >DATAMEM
__end__ = ABSOLUTE(.);
}