From 89751f29467b359339a8c8b57c218cc3328bae43 Mon Sep 17 00:00:00 2001 From: spicyjpeg <88942473+spicyjpeg@users.noreply.github.com> Date: Tue, 17 Aug 2021 11:36:56 +0000 Subject: Rewritten all Makefiles, set up proper GCC options, added iso.xml to template --- libpsn00b/ldscripts/exe.ld | 114 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 libpsn00b/ldscripts/exe.ld (limited to 'libpsn00b/ldscripts/exe.ld') diff --git a/libpsn00b/ldscripts/exe.ld b/libpsn00b/ldscripts/exe.ld new file mode 100644 index 0000000..3033636 --- /dev/null +++ b/libpsn00b/ldscripts/exe.ld @@ -0,0 +1,114 @@ +/* + * PSn00bSDK linker script for executables + * (C) 2021 spicyjpeg - MPL licensed + * + * GP-relative addressing (i.e. placing small variables in a 64 KB block and + * using $gp to reference them) is fully supported; the block is made up of + * sections .sdata and .sbss. Note that GP-relative addressing is not + * compatible with dynamic linking, as DLLs require GP to be unused. + */ + +OUTPUT_FORMAT(elf32-littlemips) +ENTRY(_start) +/*STARTUP(start.o)*/ + +MEMORY { + /* Mapped into KSEG0 */ + KERNEL_RAM (rwx) : ORIGIN = 0x80000000, LENGTH = 0x010000 + APP_RAM (rwx) : ORIGIN = 0x80010000, LENGTH = 0x1f0000 +} + +SECTIONS { + /* Text section, i.e. code and constants */ + + .text : { + __text_start = .; + + *(.text .text.* .gnu.linkonce.t.*) + *(.plt .MIPS.stubs) + } > APP_RAM + .rodata : { + *(.rodata .rodata.* .gnu.linkonce.r.*) + } > APP_RAM + + /* Global constructor and destructor arrays (length-prefixed) */ + + /* + * TODO: replace this crap with .init_array and .fini_array, which are the + * "modern" way of doing it without reversed arrays and weird length + * prefixes. That would require even more patching though. + * + * https://sourceware.org/binutils/docs/ld/Output-Section-Keywords.html + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=46770 + */ + .ctors : ALIGN(16) { + __CTOR_LIST__ = .; + + LONG(((__CTOR_END__ - __CTOR_LIST__) / 4) - 2) + KEEP(*(SORT(.ctors.*))) + KEEP(*(.ctors)) + LONG(0) + + __CTOR_END__ = .; + } > APP_RAM + .dtors : ALIGN(16) { + __DTOR_LIST__ = .; + + LONG(((__DTOR_END__ - __DTOR_LIST__) / 4) - 2) + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + LONG(0) + + __DTOR_END__ = .; + } > APP_RAM + + /* Data sections, i.e. variables with default values */ + + .data : { + *(.data .data.* .gnu.linkonce.d.*) + } > APP_RAM + + /* + * Set _gp to point to the beginning of .sdata plus 0x7ff0, so anything + * within .sdata (and .sbss) can be accessed using the $gp register as + * base plus a signed 16-bit immediate. Note that $gp is set to _gp on + * boot by _start() in the SDK. + */ + HIDDEN(_gp = ALIGN(16) + 0x7ff0); + + .sdata : { + *(.sdata .sdata.* .gnu.linkonce.s.*) + } > APP_RAM + + /* BSS sections, i.e. uninitialized variables */ + + __bss_start = .; + + .sbss (NOLOAD) : { + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + } > APP_RAM + .bss (NOLOAD) : { + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + + /* + * This crap was in the stock GCC linker script. + */ + . = ALIGN((. != 0) ? 4 : 1); + } > APP_RAM + + _end = .; + + /* Dummy section */ + + .dummy (NOLOAD) : { + KEEP(*(.dummy)) + } > APP_RAM + + /* Remove anything flagged as link-time optimized */ + + /DISCARD/ : { + *(.gnu.lto_*) + } +} -- cgit v1.2.3