diff options
| author | Dario Bartussek <[email protected]> | 2021-03-26 18:42:59 +0100 |
|---|---|---|
| committer | Dario Bartussek <[email protected]> | 2021-03-26 18:42:59 +0100 |
| commit | 2910e99c89eb10ccc3b8036a2975ae13302475d9 (patch) | |
| tree | cdcf3c32b6a0f24a8fcdf3c77073a880b9631c06 | |
| download | rust_3ds-2910e99c89eb10ccc3b8036a2975ae13302475d9.tar.xz rust_3ds-2910e99c89eb10ccc3b8036a2975ae13302475d9.zip | |
Basic example for compiling Rust for the 3DS as elf
| -rw-r--r-- | .gitignore | 7 | ||||
| -rw-r--r-- | 3ds.json | 29 | ||||
| -rw-r--r-- | 3dsx.ld | 195 | ||||
| -rw-r--r-- | Cargo.toml | 16 | ||||
| -rw-r--r-- | compile.sh | 3 | ||||
| -rw-r--r-- | rustfmt.toml | 13 | ||||
| -rw-r--r-- | src/main.rs | 14 |
7 files changed, 277 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e933378 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/.idea + +/target + +Cargo.lock + +3ds.map diff --git a/3ds.json b/3ds.json new file mode 100644 index 0000000..3c2ff61 --- /dev/null +++ b/3ds.json @@ -0,0 +1,29 @@ +{ + "llvm-target": "arm-none-eabihf", + "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", + + "os": "none", + "env": "eabi", + "vendor": "unknown", + "arch": "arm", + "target-cpu": "mpcore", + "features": "+strict-align,+v6,+vfp2,-d32", + + "target-endian": "little", + "target-pointer-width": "32", + "target-c-int-width": "32", + "max-atomic-width": 64, + + "linker-flavor": "ld.lld", + "linker": "rust-lld", + + "executables": true, + "dynamic-linking": false, + + "relocation-model": "static", + + "no-compiler-rt": true, + "panic-strategy": "abort", + + "crt-static-respected": true +} @@ -0,0 +1,195 @@ +/*-------------------------------------------------------------------------------- + This Source Code Form is subject to the terms of the Mozilla Public License, + v. 2.0. If a copy of the MPL was not distributed with this file, You can + obtain one at https://mozilla.org/MPL/2.0/. +--------------------------------------------------------------------------------*/ +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +OUTPUT_ARCH(arm) +ENTRY(_start) + +PHDRS +{ + code PT_LOAD FLAGS(5) /* Read | Execute */; + rodata PT_LOAD FLAGS(4) /* Read */; + data PT_LOAD FLAGS(6) /* Read | Write */; +} + +SECTIONS +{ + /* =========== CODE section =========== */ + + PROVIDE(__start__ = 0x100000); + . = __start__; + + .text ALIGN(0x1000) : + { + /* .init */ + KEEP( *(.crt0) ) + KEEP( *(.init) ) + . = ALIGN(4); + + /* .text */ + *(.text) + *(.text.*) + *(.glue_7) + *(.glue_7t) + *(.stub) + *(.gnu.warning) + *(.gnu.linkonce.t*) + . = ALIGN(4); + + /* .fini */ + KEEP( *(.fini) ) + . = ALIGN(4); + } : code + + /* =========== RODATA section =========== */ + + . = ALIGN(0x1000); + + .rodata : + { + *(.rodata) + *(.roda) + *(.rodata.*) + *all.rodata*(*) + *(.gnu.linkonce.r*) + SORT(CONSTRUCTORS) + . = ALIGN(4); + } : rodata + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } : rodata + __exidx_start = .; + ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } : rodata + __exidx_end = .; + + /* =========== DATA section =========== */ + + . = ALIGN(0x1000); + + .data : + { + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + CONSTRUCTORS + . = ALIGN(4); + } : data + + .tdata ALIGN(4) : + { + __tdata_lma = .; + *(.tdata) + *(.tdata.*) + *(.gnu.linkonce.td.*) + . = ALIGN(4); + __tdata_lma_end = .; + } : data + + .tbss ALIGN(4) : + { + *(.tbss) + *(.tbss.*) + *(.gnu.linkonce.tb.*) + *(.tcommon) + . = ALIGN(4); + } : data + + .preinit_array ALIGN(4) : + { + PROVIDE (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE (__preinit_array_end = .); + } : data + + .init_array ALIGN(4) : + { + PROVIDE (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE (__init_array_end = .); + } : data + + .fini_array ALIGN(4) : + { + PROVIDE (__fini_array_start = .); + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE (__fini_array_end = .); + } : data + + .ctors ALIGN(4) : + { + KEEP (*crtbegin.o(.ctors)) /* MUST be first -- GCC requires it */ + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } : data + + .dtors ALIGN(4) : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } : data + + __bss_start__ = .; + .bss ALIGN(4) : + { + *(.dynbss) + *(.bss) + *(.bss.*) + *(.gnu.linkonce.b*) + *(COMMON) + . = ALIGN(4); + + /* Reserve space for the TLS segment of the main thread */ + __tls_start = .; + . += SIZEOF(.tdata) + SIZEOF(.tbss); + __tls_end = .; + } : data + __bss_end__ = .; + + __end__ = ABSOLUTE(.) ; + + /* ================== + ==== Metadata ==== + ================== */ + + /* Discard sections that difficult post-processing */ + /DISCARD/ : { *(.group .comment .note) } + + /* Stabs debugging sections. */ + .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) } + + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + + /* 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) } +} diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..a9c6d62 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "rust_3ds" +version = "0.1.0" +authors = ["Dario Bartussek <[email protected]>"] +edition = "2018" +license = "MIT OR Apache-2.0" + +[profile.dev] +panic = "abort" +opt-level = "s" + +[profile.release] +panic = "abort" +opt-level = "s" + +[dependencies] diff --git a/compile.sh b/compile.sh new file mode 100644 index 0000000..065aba6 --- /dev/null +++ b/compile.sh @@ -0,0 +1,3 @@ +cargo fmt + +RUSTFLAGS="-C link-args=-T3dsx.ld -C link-args=-Map=3ds.map" cargo xbuild --target 3ds.json diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..ce09ecd --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,13 @@ +imports_granularity = "Crate" + +use_field_init_shorthand = true +use_try_shorthand = true + +normalize_comments = true +wrap_comments = true + +reorder_impl_items = true + +match_block_trailing_comma = true + +blank_lines_upper_bound = 2 diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..029937f --- /dev/null +++ b/src/main.rs @@ -0,0 +1,14 @@ +#![no_std] +#![no_main] + +use core::panic::PanicInfo; + +#[no_mangle] +pub extern "C" fn pre_main() -> ! { + loop {} +} + +#[panic_handler] +fn panic(_info: &PanicInfo) -> ! { + loop {} +} |