summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Bartussek <[email protected]>2021-03-26 18:42:59 +0100
committerDario Bartussek <[email protected]>2021-03-26 18:42:59 +0100
commit2910e99c89eb10ccc3b8036a2975ae13302475d9 (patch)
treecdcf3c32b6a0f24a8fcdf3c77073a880b9631c06
downloadrust_3ds-2910e99c89eb10ccc3b8036a2975ae13302475d9.tar.xz
rust_3ds-2910e99c89eb10ccc3b8036a2975ae13302475d9.zip
Basic example for compiling Rust for the 3DS as elf
-rw-r--r--.gitignore7
-rw-r--r--3ds.json29
-rw-r--r--3dsx.ld195
-rw-r--r--Cargo.toml16
-rw-r--r--compile.sh3
-rw-r--r--rustfmt.toml13
-rw-r--r--src/main.rs14
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
+}
diff --git a/3dsx.ld b/3dsx.ld
new file mode 100644
index 0000000..2901938
--- /dev/null
+++ b/3dsx.ld
@@ -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 {}
+}