diff --git a/lib/Makefile b/lib/Makefile index 5eca63fa..188bde77 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -62,7 +62,7 @@ CCFLAGS += -DJABYENGINE_$(TV_FORMAT) #Linker flags LDFLAGS_release += -Os -LDFLAGS_all += -Wl,-Map=$(TARGET).map -nostdlib -T$(AUTO_OVERLAY_DIR)/Overlays.ld -T$(JABY_ENGINE_DIR)/lib/psexe.ld -static -Wl,--gc-sections -Wl,--build-id=none +LDFLAGS_all += -Wl,-Map=$(TARGET).map -nostdlib -T$(AUTO_OVERLAY_DIR)/Overlays.ld -T$(JABY_ENGINE_DIR)/lib/psexe.ld -static -Wl,--gc-sections -Wl,--build-id=none -Wl,--no-check-sections LDFLAGS_all += $(ARCHFLAGS) -Wl,--oformat=$(FORMAT) LDFLAGS_all += $(LDFLAGS_$(BUILD_PROFILE)) diff --git a/lib/psexe.ld b/lib/psexe.ld index 4190335d..fb1869e5 100644 --- a/lib/psexe.ld +++ b/lib/psexe.ld @@ -34,6 +34,7 @@ TLOAD_ADDR = DEFINED(TLOAD_ADDR) ? TLOAD_ADDR : 0x80010000; MEMORY { loader : ORIGIN = (TLOAD_ADDR - 0x800), LENGTH = 2048 ram (rwx) : ORIGIN = 0x80010000, LENGTH = 2M - 0x10000 + ram2 (rwx) : ORIGIN = 0x80010000, LENGTH = 2M - 0x10000 dcache : ORIGIN = 0x1f800000, LENGTH = 0x400 } @@ -60,6 +61,39 @@ SECTIONS { } /*Overlay sections created by mkoverlay*/ +SECTIONS { + .planschi __bss_end : SUBALIGN(4) + { + __planschi_start = .; + __boot_loader_start = .; + + *libJabyEngine.a:*_boot.o(.text.startup._GLOBAL__*) + *_boot.o(.text.startup._GLOBAL__*) + *libJabyEngine.a:*_boot.o(.ctors) + *_boot.o(.ctors) + + *libJabyEngine.a:*_boot.o(.text.*) + *_boot.o(.text.*) + *libJabyEngine.a:*_boot.o(.rodata*) + *_boot.o(.rodata*) + *libJabyEngine.a:*_boot.o(.sdata*) + *_boot.o(.sdata*) + *libJabyEngine.a:*_boot.o(.data*) + *_boot.o(.data*) + *libJabyEngine.a:*_boot.o(.sbss*) + *_boot.o(.sbss*) + *libJabyEngine.a:*_boot.o(.bss*) + *_boot.o(.bss*) + *libJabyEngine.a:*_boot.o(*) + *_boot.o(*) + + . = ALIGN(4); + __boot_loader_end = .; + /*Only needed for the PSX BIOS to load the entire game*/ + . = ALIGN(2048); + __planschi_end = .; + } +} SECTIONS { .PSX_EXE_Header : { @@ -181,7 +215,7 @@ SECTIONS { __data_end = .; __fdata_end = .; __bss_start = .; - .sbss : { + .bss : { *(.dynsbss) *(.sbss .sbss.* .gnu.linkonce.sb.*) *(.scommon) diff --git a/src/Tools/mkoverlay/src/creator/ldscript.rs b/src/Tools/mkoverlay/src/creator/ldscript.rs index 1acf85c5..de160e7e 100644 --- a/src/Tools/mkoverlay/src/creator/ldscript.rs +++ b/src/Tools/mkoverlay/src/creator/ldscript.rs @@ -24,13 +24,7 @@ pub fn write(output: &mut Output, overlay_desc: &OverlayDesc) -> Result<(), Erro } fn get_slot_start_adr(slot: &OverlaySlot) -> &str { - if let Some(slot_adr) = &slot.start_adr { - slot_adr.as_ref() - } - - else { - OVERLAY_DEFAULT_START - } + slot.start_adr.as_ref() } if overlay_desc.additional_slots.is_empty() && overlay_desc.boot_section.is_empty() { @@ -44,7 +38,7 @@ pub fn write(output: &mut Output, overlay_desc: &OverlayDesc) -> Result<(), Erro writeln!(output, "")?; writeln!(output, "SECTIONS {{")?; writeln!(output, "\t/DISCARD/ : {{ *(.comment*) *(.gnu.*) *(.mdebug*) *(.debug_*) *(.pdr)}}")?; - write_planschi_section(output, &overlay_desc.boot_section)?; + write_first_section(output, &overlay_desc.boot_section)?; for slot in &overlay_desc.additional_slots { writeln!(output, "\t/*{}*/", slot.name)?; writeln!(output, "\tOVERLAY {} : NOCROSSREFS SUBALIGN(4) {{", get_slot_start_adr(slot))?; @@ -63,39 +57,8 @@ fn write_heap_base(output: &mut Output, heap_base: &str) -> Result<(), Error> { Ok(()) } -fn write_planschi_section(output: &mut Output, boot_overlay: &BootOverlaySection) -> Result<(), Error> { +fn write_first_section(output: &mut Output, boot_overlay: &BootOverlaySection) -> Result<(), Error> { writeln!(output, "\tOVERLAY __bss_end : NOCROSSREFS SUBALIGN(4) {{")?; - writeln!(output, "\t\t.planschi {{")?; - writeln!(output, "\t\t\t__planschi_start = .;")?; - writeln!(output, "\t\t\t__boot_loader_start = .;")?; - writeln!(output, "")?; - writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.text.startup._GLOBAL__*)")?; - writeln!(output, "\t\t\t*_boot.o(.text.startup._GLOBAL__*)")?; - writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.ctors)")?; - writeln!(output, "\t\t\t*_boot.o(.ctors)")?; - writeln!(output, "")?; - writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.text.*)")?; - writeln!(output, "\t\t\t*_boot.o(.text.*)")?; - writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.rodata*)")?; - writeln!(output, "\t\t\t*_boot.o(.rodata*)")?; - writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.sdata*)")?; - writeln!(output, "\t\t\t*_boot.o(.sdata*)")?; - writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.data*)")?; - writeln!(output, "\t\t\t*_boot.o(.data*)")?; - writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.sbss*)")?; - writeln!(output, "\t\t\t*_boot.o(.sbss*)")?; - writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(.bss*)")?; - writeln!(output, "\t\t\t*_boot.o(.bss*)")?; - writeln!(output, "\t\t\t*libJabyEngine.a:*_boot.o(*)")?; - writeln!(output, "\t\t\t*_boot.o(*)")?; - writeln!(output, "")?; - writeln!(output, "\t\t\t. = ALIGN(4);")?; - writeln!(output, "\t\t\t__boot_loader_end = .;")?; - writeln!(output, "\t\t\t/*Only needed for the PSX BIOS to load the entire game*/")?; - writeln!(output, "\t\t\t. = ALIGN(2048);")?; - writeln!(output, "\t\t\t__planschi_end = .;")?; - writeln!(output, "\t\t}}")?; - writeln!(output, "")?; writeln!(output, "\t\t/*{}*/", boot_overlay.name)?; write_section(output, &boot_overlay.sections, true)?; writeln!(output, "\t}}")?; diff --git a/src/Tools/mkoverlay/src/types/json_reader/mod.rs b/src/Tools/mkoverlay/src/types/json_reader/mod.rs index 1e2f1d1f..acd48cf5 100644 --- a/src/Tools/mkoverlay/src/types/json_reader/mod.rs +++ b/src/Tools/mkoverlay/src/types/json_reader/mod.rs @@ -10,24 +10,18 @@ pub fn read_config(input: Input) -> Result { if let Some(objects) = json_reader.as_object() { for object in objects { let mut slot = read_as_slot(object)?; - if slot.start_adr.is_none() { - if overlay_desc.boot_section.is_empty() { - overlay_desc.boot_section = BootOverlaySection::new(slot.name, slot.sections); - } - - else { - if let Some(prev_slot) = overlay_desc.additional_slots.last() { - slot.set_start_adr_as_end_of(prev_slot.name.as_ref()); - } - - else { - slot.set_start_adr_as_end_of("planschi"); - } - overlay_desc.additional_slots.push(slot); - } + if overlay_desc.boot_section.is_empty() { + overlay_desc.boot_section = BootOverlaySection::new(slot.name, slot.sections); } else { + if let Some(prev_slot) = overlay_desc.additional_slots.last() { + slot.set_start_adr_as_end_of(prev_slot.name.as_ref()); + } + + else { + slot.set_start_adr_as_end_of("bss"); + } overlay_desc.additional_slots.push(slot); } } @@ -42,7 +36,7 @@ pub fn read_config(input: Input) -> Result { fn read_as_slot(json_value: (&String, &serde_json::Value)) -> Result { let (slot_name, json_value) = json_value; - let mut slot = OverlaySlot::new(slot_name.clone(), None); + let mut slot = OverlaySlot::new(slot_name.clone(), "bss"); if let Some(json_value) = json_value.as_object() { for (name, json_value) in json_value { diff --git a/src/Tools/mkoverlay/src/types/mod.rs b/src/Tools/mkoverlay/src/types/mod.rs index b240c8dc..f35e29c1 100644 --- a/src/Tools/mkoverlay/src/types/mod.rs +++ b/src/Tools/mkoverlay/src/types/mod.rs @@ -49,26 +49,17 @@ impl OverlaySection { pub struct OverlaySlot { pub(super) name: String, - pub(super) start_adr: Option, + pub(super) start_adr: String, pub(super) sections: Vec } impl OverlaySlot { - pub fn new(name: String, start_adr: Option<&str>) -> OverlaySlot { - let start_adr = { - if let Some(str) = start_adr { - Some(str.to_owned()) - } - - else { - None - } - }; - OverlaySlot{name, start_adr, sections: Vec::new()} + pub fn new(name: String, start_adr: &str) -> OverlaySlot { + OverlaySlot{name, start_adr: String::from(start_adr), sections: Vec::new()} } pub fn set_start_adr_as_end_of(&mut self, end: &str) { - self.start_adr = Some(format!("__{}_end", end)); + self.start_adr = format!("__{}_end", end); } pub fn add_section(&mut self, section: OverlaySection) {