mirror of
https://github.com/italicsjenga/agb.git
synced 2024-12-23 08:11:33 +11:00
Fixing up the linker scripts (#503)
* Builds upon #501 with related improvements we wanted to make. * Fixes multiboot to work, and to work on mgba. * Remove the need for copying the linker scripts into your repo - [x] Changelog updated
This commit is contained in:
commit
1a468e7b55
|
@ -7,8 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- There is now a multiboot feature which you can use to easily make multiboot ROMs.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- You no longer need the gba.ld or gba_mb.ld files in your repository. You should delete these when upgrading.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
- Multiboot builds now work on mgba.
|
||||||
- Fixed inaccuracy in cosine implementation caused by accidentally multiplying correction term by zero.
|
- Fixed inaccuracy in cosine implementation caused by accidentally multiplying correction term by zero.
|
||||||
|
|
||||||
## [0.17.1] - 2023/10/05
|
## [0.17.1] - 2023/10/05
|
||||||
|
|
|
@ -10,6 +10,7 @@ repository = "https://github.com/agbrs/agb"
|
||||||
[features]
|
[features]
|
||||||
default = ["testing"]
|
default = ["testing"]
|
||||||
testing = []
|
testing = []
|
||||||
|
multiboot = []
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bitflags = "2"
|
bitflags = "2"
|
||||||
|
|
21
agb/build.rs
21
agb/build.rs
|
@ -1,5 +1,20 @@
|
||||||
fn main() {
|
use std::{env, error::Error, fs, path::PathBuf};
|
||||||
println!("cargo:rerun-if-changed=gba.ld");
|
|
||||||
println!("cargo:rerun-if-changed=gba_mb.ld");
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
let out = &PathBuf::from(env::var("OUT_DIR").unwrap());
|
||||||
|
let linker_script = if env::var("CARGO_FEATURE_MULTIBOOT").is_ok() {
|
||||||
|
include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/gba_mb.ld")).as_slice()
|
||||||
|
} else {
|
||||||
|
include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/gba.ld")).as_slice()
|
||||||
|
};
|
||||||
|
|
||||||
|
fs::write(out.join("gba.ld"), linker_script)?;
|
||||||
|
println!("cargo:rustc-link-search={}", out.display());
|
||||||
|
|
||||||
|
println!("cargo:rerun-if-changed=src/gba.ld");
|
||||||
|
println!("cargo:rerun-if-changed=src/gba_mb.ld");
|
||||||
println!("cargo:rerun-if-changed=build.rs");
|
println!("cargo:rerun-if-changed=build.rs");
|
||||||
|
println!("cargo:rerun-if-env-changed=CARGO_FEATURE_MULTIBOOT");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
113
agb/gba_mb.ld
113
agb/gba_mb.ld
|
@ -1,113 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(ewram);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > ewram
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>ewram
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>ewram
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
|
@ -126,22 +126,22 @@ pub(crate) unsafe fn number_of_blocks() -> u32 {
|
||||||
|
|
||||||
fn iwram_data_end() -> usize {
|
fn iwram_data_end() -> usize {
|
||||||
extern "C" {
|
extern "C" {
|
||||||
static __iwram_end: usize;
|
static __iwram_end: u8;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: This seems completely wrong, but without the &, rust generates
|
// Symbols defined in the linker have an address *but no data or value*.
|
||||||
// a double dereference :/. Maybe a bug in nightly?
|
// As strange as this looks, they are only useful to take the address of.
|
||||||
(unsafe { &__iwram_end }) as *const _ as usize
|
unsafe { core::ptr::addr_of!(__iwram_end) as usize }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn data_end() -> usize {
|
fn data_end() -> usize {
|
||||||
extern "C" {
|
extern "C" {
|
||||||
static __ewram_data_end: usize;
|
static __ewram_data_end: u8;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: This seems completely wrong, but without the &, rust generates
|
// Symbols defined in the linker have an address *but no data or value*.
|
||||||
// a double dereference :/. Maybe a bug in nightly?
|
// As strange as this looks, they are only useful to take the address of.
|
||||||
(unsafe { &__ewram_data_end }) as *const _ as usize
|
unsafe { core::ptr::addr_of!(__ewram_data_end) as usize }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
@ -1,31 +1,13 @@
|
||||||
|
|
||||||
.arm
|
.arm
|
||||||
.global __start
|
.section .entrypoint.regular, "ax", %progbits
|
||||||
.section .crt0
|
|
||||||
.align
|
.align
|
||||||
|
.global __start
|
||||||
__start:
|
__start:
|
||||||
b .Initialise
|
b .Initialise
|
||||||
|
|
||||||
@ Filled in by gbafix
|
@ Filled in by gbafix
|
||||||
.fill 188, 1, 0
|
.space 188
|
||||||
|
|
||||||
@ multiboot launch point
|
|
||||||
b .Initialise_mb
|
|
||||||
|
|
||||||
.byte 0 @ boot mode, BIOS overwrites this value
|
|
||||||
.byte 0 @ slave ID number
|
|
||||||
.fill 26, 1, 0 @ unused?
|
|
||||||
.word 0 @ joybus entrypoint
|
|
||||||
|
|
||||||
.Initialise_mb:
|
|
||||||
swi 0x00250000
|
|
||||||
|
|
||||||
@ Set interrupt handler
|
|
||||||
ldr r0, =InterruptHandler
|
|
||||||
ldr r1, =0x03007FFC
|
|
||||||
str r0, [r1]
|
|
||||||
|
|
||||||
b .CommonInit
|
|
||||||
|
|
||||||
.Initialise:
|
.Initialise:
|
||||||
@ Set interrupt handler
|
@ Set interrupt handler
|
||||||
|
@ -43,8 +25,40 @@ b .Initialise_mb
|
||||||
@ r2: length + size information
|
@ r2: length + size information
|
||||||
@
|
@
|
||||||
@ see: https://mgba-emu.github.io/gbatek/#swi-0bh-gbands7nds9dsi7dsi9---cpuset
|
@ see: https://mgba-emu.github.io/gbatek/#swi-0bh-gbands7nds9dsi7dsi9---cpuset
|
||||||
|
ldr r0, =CommonInit
|
||||||
|
bx r0
|
||||||
|
|
||||||
.CommonInit:
|
.arm
|
||||||
|
.section .entrypoint.multiboot, "ax", %progbits
|
||||||
|
.align
|
||||||
|
b __mb_entry
|
||||||
|
@ Filled in by gbafix
|
||||||
|
.space 188
|
||||||
|
@ multiboot launch point
|
||||||
|
.global __mb_entry
|
||||||
|
__mb_entry:
|
||||||
|
b .Initialise_mb
|
||||||
|
|
||||||
|
.byte 0 @ boot mode, BIOS overwrites this value
|
||||||
|
.byte 0 @ slave ID number
|
||||||
|
.space 26 @ unused?
|
||||||
|
|
||||||
|
.Initialise_mb:
|
||||||
|
swi 0x00250000
|
||||||
|
|
||||||
|
@ Set interrupt handler
|
||||||
|
ldr r0, =InterruptHandler
|
||||||
|
ldr r1, =0x03007FFC
|
||||||
|
str r0, [r1]
|
||||||
|
|
||||||
|
ldr r0, =CommonInit
|
||||||
|
bx r0
|
||||||
|
|
||||||
|
.arm
|
||||||
|
.section .entrypoint.common, "ax", %progbits
|
||||||
|
.align
|
||||||
|
.global CommonInit
|
||||||
|
CommonInit:
|
||||||
@ set the waitstate control register to the normal value used in manufactured cartridges
|
@ set the waitstate control register to the normal value used in manufactured cartridges
|
||||||
ldr r0, =0x04000204 @ address for waitstate control register
|
ldr r0, =0x04000204 @ address for waitstate control register
|
||||||
ldr r1, =0x4317 @ WS0/ROM=3,1 clks; SRAM=8 clks; WS2/EEPROM: 8,8 clks; prefetch enabled
|
ldr r1, =0x4317 @ WS0/ROM=3,1 clks; SRAM=8 clks; WS2/EEPROM: 8,8 clks; prefetch enabled
|
|
@ -7,70 +7,66 @@ EXTERN(__RUST_INTERRUPT_HANDLER)
|
||||||
EXTERN(__agbabi_memset)
|
EXTERN(__agbabi_memset)
|
||||||
EXTERN(__agbabi_memcpy)
|
EXTERN(__agbabi_memcpy)
|
||||||
|
|
||||||
|
/* The bios reserves the final 256 bytes of iwram for its exclusive use, so we
|
||||||
|
* need to avoid writing there */
|
||||||
|
__bios_reserved_iwram = 256;
|
||||||
|
|
||||||
MEMORY {
|
MEMORY {
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K - __bios_reserved_iwram
|
||||||
rom (rx) : ORIGIN = 0x08000000, LENGTH = 32M
|
rom (rx) : ORIGIN = 0x08000000, LENGTH = 32M
|
||||||
}
|
}
|
||||||
|
|
||||||
__text_start = ORIGIN(rom);
|
|
||||||
|
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
. = __text_start;
|
. = ORIGIN(rom);
|
||||||
|
|
||||||
|
.entrypoint : {
|
||||||
|
*(.entrypoint.regular .entrypoint.common);
|
||||||
|
. = ALIGN(4);
|
||||||
|
} > rom
|
||||||
|
|
||||||
.text : {
|
.text : {
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
*(.text .text*);
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
} > rom
|
} > rom
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
.rodata : {
|
||||||
*(.rodata .rodata.*);
|
*(.rodata .rodata.*);
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
} > rom
|
} > rom
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
.iwram : {
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
*(.iwram .iwram.*);
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
*(.text_iwram .text_iwram.*);
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>rom
|
} > iwram AT>rom
|
||||||
|
__iwram_data_start = ADDR(.iwram);
|
||||||
|
__iwram_rom_start = LOADADDR(.iwram);
|
||||||
|
__iwram_rom_length_halfwords = (SIZEOF(.iwram) + 1) / 2;
|
||||||
|
__iwram_end = __iwram_data_start + SIZEOF(.iwram);
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
.ewram : {
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
*(.ewram .ewram.*);
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
|
||||||
*(.data .data.*);
|
*(.data .data.*);
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>rom
|
} > ewram AT>rom
|
||||||
|
__ewram_data_start = ADDR(.ewram);
|
||||||
|
__ewram_rom_start = LOADADDR(.ewram);
|
||||||
|
__ewram_rom_length_halfwords = (SIZEOF(.ewram) + 1) / 2;
|
||||||
|
|
||||||
.bss : {
|
.bss : {
|
||||||
*(.bss .bss.*);
|
*(.bss .bss.*);
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__iwram_end = ABSOLUTE(.);
|
= ABSOLUTE(.);
|
||||||
} > iwram
|
} > ewram
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
__ewram_data_end = __ewram_data_start + SIZEOF(.ewram) + SIZEOF(.bss);
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
.shstrtab : {
|
||||||
*(.shstrtab)
|
*(.shstrtab)
|
|
@ -1,80 +1,76 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
||||||
OUTPUT_ARCH(arm)
|
OUTPUT_ARCH(arm)
|
||||||
|
|
||||||
ENTRY(__start)
|
ENTRY(__mb_entry)
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
EXTERN(__RUST_INTERRUPT_HANDLER)
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
EXTERN(__agbabi_memset)
|
||||||
EXTERN(__agbabi_memcpy)
|
EXTERN(__agbabi_memcpy)
|
||||||
|
|
||||||
|
/* The bios reserves the final 256 bytes of iwram for its exclusive use, so we
|
||||||
|
* need to avoid writing there */
|
||||||
|
__bios_reserved_iwram = 256;
|
||||||
|
|
||||||
MEMORY {
|
MEMORY {
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K - __bios_reserved_iwram
|
||||||
}
|
}
|
||||||
|
|
||||||
__text_start = ORIGIN(ewram);
|
|
||||||
|
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
. = __text_start;
|
. = ORIGIN(ewram);
|
||||||
|
|
||||||
|
.entrypoint : {
|
||||||
|
*(.entrypoint.multiboot .entrypoint.common);
|
||||||
|
. = ALIGN(4);
|
||||||
|
} > ewram
|
||||||
|
|
||||||
.text : {
|
.text : {
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
*(.text .text*);
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
} > rom
|
} > ewram
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
.rodata : {
|
||||||
*(.rodata .rodata.*);
|
*(.rodata .rodata.*);
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
} > ewram
|
} > ewram
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
.iwram : {
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
*(.iwram .iwram.*);
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
*(.text_iwram .text_iwram.*);
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>ewram
|
} > iwram AT>ewram
|
||||||
|
__iwram_data_start = ADDR(.iwram);
|
||||||
|
__iwram_rom_start = LOADADDR(.iwram);
|
||||||
|
__iwram_rom_length_halfwords = (SIZEOF(.iwram) + 1) / 2;
|
||||||
|
__iwram_end = __iwram_data_start + SIZEOF(.iwram);
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
.ewram : {
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
*(.ewram .ewram.*);
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
|
||||||
*(.data .data.*);
|
*(.data .data.*);
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
} > ewram
|
||||||
} > ewram AT>ewram
|
__ewram_data_start = ADDR(.ewram);
|
||||||
|
__ewram_rom_start = LOADADDR(.ewram);
|
||||||
|
__ewram_rom_length_halfwords = (SIZEOF(.ewram) + 1) / 2;
|
||||||
|
|
||||||
.bss : {
|
.bss : {
|
||||||
*(.bss .bss.*);
|
*(.bss .bss.*);
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__iwram_end = ABSOLUTE(.);
|
= ABSOLUTE(.);
|
||||||
} > iwram
|
} > ewram
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
__ewram_data_end = __ewram_data_start + SIZEOF(.ewram) + SIZEOF(.bss);
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
.shstrtab : {
|
||||||
*(.shstrtab)
|
*(.shstrtab)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* debugging sections */
|
/* debugging sections */
|
||||||
/* Stabs */
|
/* Stabs */
|
||||||
.stab 0 : { *(.stab) }
|
.stab 0 : { *(.stab) }
|
||||||
.stabstr 0 : { *(.stabstr) }
|
.stabstr 0 : { *(.stabstr) }
|
|
@ -2,7 +2,7 @@ use core::arch::global_asm;
|
||||||
|
|
||||||
global_asm!(include_str!("asm_include.s"));
|
global_asm!(include_str!("asm_include.s"));
|
||||||
|
|
||||||
global_asm!(include_str!("crt0.s"));
|
global_asm!(include_str!("entrypoint.s"));
|
||||||
global_asm!(include_str!("interrupt_handler.s"));
|
global_asm!(include_str!("interrupt_handler.s"));
|
||||||
global_asm!(include_str!("sound/mixer/mixer.s"));
|
global_asm!(include_str!("sound/mixer/mixer.s"));
|
||||||
global_asm!(include_str!("save/asm_routines.s"));
|
global_asm!(include_str!("save/asm_routines.s"));
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
@ An interrupt handler that simply acknowledges all interrupts
|
@ An interrupt handler that simply acknowledges all interrupts
|
||||||
.arm
|
.arm
|
||||||
.global InterruptHandler
|
.global InterruptHandler
|
||||||
.section .iwram, "ax", %progbits
|
.section .iwram.interrupt_handler, "ax", %progbits
|
||||||
.align
|
.align
|
||||||
InterruptHandler:
|
InterruptHandler:
|
||||||
mov r2, #0x04000000 @ interrupt enable register location
|
mov r2, #0x04000000 @ interrupt enable register location
|
||||||
|
|
|
@ -459,7 +459,8 @@ mod test {
|
||||||
let address = iwram_ptr as usize;
|
let address = iwram_ptr as usize;
|
||||||
assert!(
|
assert!(
|
||||||
(0x0200_0000..0x0204_0000).contains(&address),
|
(0x0200_0000..0x0204_0000).contains(&address),
|
||||||
"implicit data storage is expected to be in ewram, which is between 0x0300_0000 and 0x0300_8000, but was actually found to be at {address:#010X}" );
|
"implicit data storage is expected to be in ewram, which is between 0x0300_0000 and 0x0300_8000, but was actually found to be at {address:#010X}"
|
||||||
|
);
|
||||||
let c = iwram_ptr.read_volatile();
|
let c = iwram_ptr.read_volatile();
|
||||||
assert_eq!(c, 9, "expected content to be 9");
|
assert_eq!(c, 9, "expected content to be 9");
|
||||||
iwram_ptr.write_volatile(u32::MAX);
|
iwram_ptr.write_volatile(u32::MAX);
|
||||||
|
|
29
agb/tests/test_multiboot.rs
Normal file
29
agb/tests/test_multiboot.rs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
#![feature(custom_test_frameworks)]
|
||||||
|
#![reexport_test_harness_main = "test_main"]
|
||||||
|
#![test_runner(agb::test_runner::test_runner)]
|
||||||
|
|
||||||
|
fn hello() {}
|
||||||
|
|
||||||
|
#[test_case]
|
||||||
|
fn multiboot_test(_gba: &mut agb::Gba) {
|
||||||
|
let address: usize = hello as usize;
|
||||||
|
|
||||||
|
if option_env!("AGB_MULTIBOOT").is_some() {
|
||||||
|
assert!(
|
||||||
|
(0x0200_0000..0x0204_0000).contains(&address),
|
||||||
|
"multiboot functions should all be in ewram 0x0300_0000 and 0x0300_8000, but was actually found to be at {address:#010X}"
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
assert!(
|
||||||
|
address >= 0x0800_0000,
|
||||||
|
"functions should all be in ROM >= 0x0800_0000, but was actually found to be at {address:#010X}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[agb::entry]
|
||||||
|
fn entry(_gba: agb::Gba) -> ! {
|
||||||
|
loop {}
|
||||||
|
}
|
|
@ -1,115 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
rom (rx) : ORIGIN = 0x08000000, LENGTH = 32M
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(rom);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>rom
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>rom
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
|
@ -1,113 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(ewram);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > ewram
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>ewram
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>ewram
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
|
@ -1,115 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
rom (rx) : ORIGIN = 0x08000000, LENGTH = 32M
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(rom);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>rom
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>rom
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
|
@ -1,115 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
rom (rx) : ORIGIN = 0x08000000, LENGTH = 32M
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(rom);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>rom
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>rom
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
|
@ -1,113 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(ewram);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > ewram
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>ewram
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>ewram
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
|
@ -1,115 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
rom (rx) : ORIGIN = 0x08000000, LENGTH = 32M
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(rom);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>rom
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>rom
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
|
@ -1,113 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(ewram);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > ewram
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>ewram
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>ewram
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
|
@ -1,115 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
rom (rx) : ORIGIN = 0x08000000, LENGTH = 32M
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(rom);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>rom
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>rom
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
|
@ -1,113 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(ewram);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > ewram
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>ewram
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>ewram
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
|
@ -1,115 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
rom (rx) : ORIGIN = 0x08000000, LENGTH = 32M
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(rom);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>rom
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>rom
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
|
@ -1,115 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
rom (rx) : ORIGIN = 0x08000000, LENGTH = 32M
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(rom);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>rom
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>rom
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
|
@ -1,113 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(ewram);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > ewram
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>ewram
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>ewram
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
13
justfile
13
justfile
|
@ -15,6 +15,7 @@ clippy:
|
||||||
|
|
||||||
test:
|
test:
|
||||||
just _test-debug agb
|
just _test-debug agb
|
||||||
|
just _test-multiboot
|
||||||
just _test-debug agb-fixnum
|
just _test-debug agb-fixnum
|
||||||
just _test-debug agb-hashmap
|
just _test-debug agb-hashmap
|
||||||
just _test-debug tracker/agb-tracker
|
just _test-debug tracker/agb-tracker
|
||||||
|
@ -64,11 +65,7 @@ run-game game:
|
||||||
run-game-debug game:
|
run-game-debug game:
|
||||||
(cd "examples/{{game}}" && cargo run)
|
(cd "examples/{{game}}" && cargo run)
|
||||||
|
|
||||||
check-linker-script-consistency:
|
ci: build-debug clippy fmt-check test miri build-release test-release doctest-agb test-games build-roms build-book check-docs
|
||||||
find -type f -name gba.ld -print0 | xargs -0 -n1 cmp -- agb/gba.ld
|
|
||||||
find -type f -name gba_mb.ld -print0 | xargs -0 -n1 cmp -- agb/gba_mb.ld
|
|
||||||
|
|
||||||
ci: check-linker-script-consistency build-debug clippy fmt-check test miri build-release test-release doctest-agb test-games build-roms build-book check-docs
|
|
||||||
|
|
||||||
build-roms:
|
build-roms:
|
||||||
just _build-rom "examples/the-purple-night" "PURPLENIGHT"
|
just _build-rom "examples/the-purple-night" "PURPLENIGHT"
|
||||||
|
@ -88,10 +85,6 @@ build-book:
|
||||||
update-lockfiles *args:
|
update-lockfiles *args:
|
||||||
bash .github/scripts/update-lockfiles.sh {{args}}
|
bash .github/scripts/update-lockfiles.sh {{args}}
|
||||||
|
|
||||||
update-linker-scripts:
|
|
||||||
find -type f -name gba.ld | grep -v ./agb/gba.ld | xargs -n1 cp -v -- agb/gba.ld
|
|
||||||
find -type f -name gba_mb.ld | grep -v ./agb/gba_mb.ld | xargs -n1 cp -v -- agb/gba_mb.ld
|
|
||||||
|
|
||||||
publish *args: (_run-tool "publish" args)
|
publish *args: (_run-tool "publish" args)
|
||||||
|
|
||||||
release +args: (_run-tool "release" args)
|
release +args: (_run-tool "release" args)
|
||||||
|
@ -152,6 +145,8 @@ _test-debug crate:
|
||||||
(cd "{{crate}}" && cargo test)
|
(cd "{{crate}}" && cargo test)
|
||||||
_test-debug-arm crate:
|
_test-debug-arm crate:
|
||||||
(cd "{{crate}}" && cargo test --target=armv4t-none-eabi)
|
(cd "{{crate}}" && cargo test --target=armv4t-none-eabi)
|
||||||
|
_test-multiboot:
|
||||||
|
(cd "agb" && AGB_MULTIBOOT=true cargo test --features=multiboot --test=test_multiboot)
|
||||||
_clippy crate:
|
_clippy crate:
|
||||||
(cd "{{crate}}" && cargo clippy --examples --tests -- {{CLIPPY_ARGUMENTS}})
|
(cd "{{crate}}" && cargo clippy --examples --tests -- {{CLIPPY_ARGUMENTS}})
|
||||||
_clean crate:
|
_clean crate:
|
||||||
|
|
115
template/gba.ld
115
template/gba.ld
|
@ -1,115 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
rom (rx) : ORIGIN = 0x08000000, LENGTH = 32M
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(rom);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>rom
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>rom
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
|
@ -1,113 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(ewram);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > ewram
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>ewram
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>ewram
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
|
@ -1,115 +0,0 @@
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
|
|
||||||
ENTRY(__start)
|
|
||||||
EXTERN(__RUST_INTERRUPT_HANDLER)
|
|
||||||
|
|
||||||
EXTERN(__agbabi_memset)
|
|
||||||
EXTERN(__agbabi_memcpy)
|
|
||||||
|
|
||||||
MEMORY {
|
|
||||||
ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K
|
|
||||||
iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K
|
|
||||||
rom (rx) : ORIGIN = 0x08000000, LENGTH = 32M
|
|
||||||
}
|
|
||||||
|
|
||||||
__text_start = ORIGIN(rom);
|
|
||||||
|
|
||||||
SECTIONS {
|
|
||||||
. = __text_start;
|
|
||||||
|
|
||||||
|
|
||||||
.text : {
|
|
||||||
KEEP(*(.crt0));
|
|
||||||
*(.crt0 .crt0*);
|
|
||||||
*(.text .text*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
__text_end = .;
|
|
||||||
|
|
||||||
.rodata : {
|
|
||||||
*(.rodata .rodata.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
} > rom
|
|
||||||
|
|
||||||
__iwram_rom_start = .;
|
|
||||||
.iwram : {
|
|
||||||
__iwram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.iwram .iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.text_iwram .text_iwram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__iwram_data_end = ABSOLUTE(.);
|
|
||||||
} > iwram AT>rom
|
|
||||||
|
|
||||||
. = __iwram_rom_start + (__iwram_data_end - __iwram_data_start);
|
|
||||||
|
|
||||||
__ewram_rom_start = .;
|
|
||||||
.ewram : {
|
|
||||||
__ewram_data_start = ABSOLUTE(.);
|
|
||||||
|
|
||||||
*(.ewram .ewram.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
*(.data .data.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
|
|
||||||
__ewram_data_end = ABSOLUTE(.);
|
|
||||||
} > ewram AT>rom
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
*(.bss .bss.*);
|
|
||||||
. = ALIGN(4);
|
|
||||||
__iwram_end = ABSOLUTE(.);
|
|
||||||
} > iwram
|
|
||||||
|
|
||||||
__iwram_rom_length_bytes = __iwram_data_end - __iwram_data_start;
|
|
||||||
__iwram_rom_length_halfwords = (__iwram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
__ewram_rom_length_bytes = __ewram_data_end - __ewram_data_start;
|
|
||||||
__ewram_rom_length_halfwords = (__ewram_rom_length_bytes + 1) / 2;
|
|
||||||
|
|
||||||
.shstrtab : {
|
|
||||||
*(.shstrtab)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debugging sections */
|
|
||||||
/* Stabs */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
/* DWARF 1 */
|
|
||||||
.debug 0 : { *(.debug) }
|
|
||||||
.line 0 : { *(.line) }
|
|
||||||
/* GNU DWARF 1 extensions */
|
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
/* DWARF 2 */
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
|
||||||
.debug_str 0 : { *(.debug_str) }
|
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
|
||||||
|
|
||||||
.debug_ranges 0 : { *(.debug_ranges) }
|
|
||||||
|
|
||||||
/* discard anything not already mentioned */
|
|
||||||
/DISCARD/ : { *(*) }
|
|
||||||
}
|
|
Loading…
Reference in a new issue