diff --git a/dkarm-eabi/crtls/3dsx.ld b/dkarm-eabi/crtls/3dsx.ld new file mode 100644 index 0000000..61cbb08 --- /dev/null +++ b/dkarm-eabi/crtls/3dsx.ld @@ -0,0 +1,158 @@ +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 =========== */ + + . = 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); + } : code + + /* =========== RODATA section =========== */ + + .rodata ALIGN(0x1000) : + { + *(.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 =========== */ + + .data ALIGN(0x1000) : + { + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + CONSTRUCTORS + . = 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); + } : 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/dkarm-eabi/crtls/3dsx.specs b/dkarm-eabi/crtls/3dsx.specs new file mode 100644 index 0000000..998c4d7 --- /dev/null +++ b/dkarm-eabi/crtls/3dsx.specs @@ -0,0 +1,8 @@ +%rename link old_link + +*link: +%(old_link) -T 3dsx.ld%s -d --emit-relocs --use-blx + +*startfile: +3dsx_crt0%O%s crti%O%s crtbegin%O%s + diff --git a/dkarm-eabi/crtls/3dsx_crt0.s b/dkarm-eabi/crtls/3dsx_crt0.s new file mode 100644 index 0000000..312eba2 --- /dev/null +++ b/dkarm-eabi/crtls/3dsx_crt0.s @@ -0,0 +1,73 @@ +@--------------------------------------------------------------------------------- +@ 3DS processor selection +@--------------------------------------------------------------------------------- + .cpu mpcore +@--------------------------------------------------------------------------------- + +@--------------------------------------------------------------------------------- + .section ".crt0" + .global _start, __service_ptr, __apt_appid, __heap_size, __linear_heap_size, __system_arglist, __system_runflags +@--------------------------------------------------------------------------------- + .align 2 + .arm +@--------------------------------------------------------------------------------- +_start: +@--------------------------------------------------------------------------------- + b startup + .ascii "_prm" +__service_ptr: + .word 0 @ Pointer to service handle override list -- if non-NULL it is assumed that we have been launched from a homebrew launcher +__apt_appid: + .word 0x300 @ Program APPID +__heap_size: + .word 24*1024*1024 @ Default heap size (24 MiB) +__linear_heap_size: + .word 32*1024*1024 @ Default linear heap size (32 MiB) +__system_arglist: + .word 0 @ Pointer to argument list (argc (u32) followed by that many NULL terminated strings) +__system_runflags: + .word 0 @ Flags to signal runtime restrictions to ctrulib +startup: + @ Save return address + mov r4, lr + + @ Clear the BSS section + ldr r0, =__bss_start__ + ldr r1, =__bss_end__ + sub r1, r1, r0 + bl ClearMem + + @ System initialization + mov r0, r4 + bl initSystem + + @ Set up argc/argv arguments for main() + ldr r0, =__system_argc + ldr r1, =__system_argv + ldr r0, [r0] + ldr r1, [r1] + + @ Jump to user code + ldr r3, =main + ldr lr, =__ctru_exit + bx r3 + +@--------------------------------------------------------------------------------- +@ Clear memory to 0x00 if length != 0 +@ r0 = Start Address +@ r1 = Length +@--------------------------------------------------------------------------------- +ClearMem: +@--------------------------------------------------------------------------------- + mov r2, #3 @ Round down to nearest word boundary + add r1, r1, r2 @ Shouldn't be needed + bics r1, r1, r2 @ Clear 2 LSB (and set Z) + bxeq lr @ Quit if copy size is 0 + + mov r2, #0 +ClrLoop: + stmia r0!, {r2} + subs r1, r1, #4 + bne ClrLoop + + bx lr diff --git a/dkarm-eabi/rules/3ds_rules b/dkarm-eabi/rules/3ds_rules new file mode 100644 index 0000000..c912cb5 --- /dev/null +++ b/dkarm-eabi/rules/3ds_rules @@ -0,0 +1,40 @@ +ifeq ($(strip $(DEVKITPRO)),) +$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=devkitPro) +endif + +include $(DEVKITARM)/base_rules + +# This line will be enabled in the future +# CTRULIB := $(DEVKITPRO)/libctru + +ifeq ($(strip $(APP_TITLE)),) +APP_TITLE := $(notdir $(OUTPUT)) +endif + +ifeq ($(strip $(APP_DESCRIPTION)),) +APP_DESCRIPTION := Built with devkitARM & ctrulib +endif + +ifeq ($(strip $(APP_AUTHOR)),) +APP_AUTHOR := Unspecified Author +endif + +ifeq ($(strip $(APP_ICON)),) +APP_ICON := $(CTRULIB)/default_icon.png +endif + +#--------------------------------------------------------------------------------- +%.smdh: $(APP_ICON) $(MAKEFILE_LIST) + @smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@ + @echo built ... $(notdir $@) + +#--------------------------------------------------------------------------------- +%.3dsx: %.elf + @3dsxtool $< $@ + @echo built ... $(notdir $@) + +#--------------------------------------------------------------------------------- +%.elf: + @echo linking $(notdir $@) + @$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@ + @$(NM) -CSn $@ > $(notdir $*.lst)