psxsdk/misc/genscripts.sh
Xavier Del Campo Romero 89b059cace Allocate .sbss and .common into .bss
GNU ld fragments .bss into .sbss and .common (see man nm(1) for further
reference). However, the linker script used by PSXSDK did not determine where
to put such sections, causing some statically allocated objects to be placed
**after** __bss_end, leading to undefined behaviour.
2020-11-07 16:02:54 +01:00

90 lines
1.8 KiB
Bash
Executable File

#!/bin/sh
# This shell script will generate the playstation.x linker script, and the psx-gcc and psx-elf2x shell scripts.
# You have to pass the PREFIX of the toolchain as the first argument of this shell script
echo "/*
* Linker script to generate an ELF file
* that has to be converted to PS-X EXE.
*/
TARGET(\"elf32-littlemips\")
OUTPUT_ARCH(\"mips\")
ENTRY(\"_start\")
SEARCH_DIR(\"$1/lib\")
STARTUP(start.o)
INPUT(-lpsx -lgcc)
SECTIONS
{
. = 0x80010000;
.text ALIGN(4) :
{
*(.text*)
}
.rodata ALIGN(4) :
{
*(.rodata)
}
.data ALIGN(4) :
{
*(.data)
}
.ctors ALIGN(4) :
{
*(.ctors)
}
.dtors ALIGN(4) :
{
*(.dtors)
}
.bss ALIGN(4) :
{
*(.bss)
*(.bss.*)
*(.gnu.linkonce.b.*)
*(COMMON)
*(.sbss)
*(.sbss.*)
*(.gnu.linkonce.sb.*)
*(.scommon)
}
__text_start = ADDR(.text);
__text_end = ADDR(.text) + SIZEOF(.text);
__rodata_start = ADDR(.rodata);
__rodata_end = ADDR(.rodata) + SIZEOF(.rodata);
__data_start = ADDR(.data);
__data_end = ADDR(.data) + SIZEOF(.data);
__ctor_list = ADDR(.ctors);
__ctor_end = ADDR(.ctors) + SIZEOF(.ctors);
__dtor_list = ADDR(.dtors);
__dtor_end = ADDR(.dtors) + SIZEOF(.dtors);
__bss_start = ADDR(.bss);
__bss_end = ADDR(.bss) + SIZEOF(.bss);
__scratchpad = 0x1f800000;
}
" > playstation.x
echo "#!/bin/sh
mipsel-unknown-elf-gcc -D__PSXSDK__ -fno-strict-overflow -fsigned-char -msoft-float -mno-gpopt -fno-builtin -g -I$1/include -T $1/mipsel-unknown-elf/lib/ldscripts/playstation.x \$*"> psx-gcc
chmod +x psx-gcc
echo "#!/bin/sh
mipsel-unknown-elf-g++ -D__PSXSDK__ -fno-strict-overflow -fsigned-char -msoft-float -mno-gpopt -fno-builtin -g -I$1/include -T $1/mipsel-unknown-elf/lib/ldscripts/playstation.x -fno-rtti -fno-exceptions -fno-threadsafe-statics -fno-use-cxa-atexit \$*" > psx-g++
chmod +x psx-g++