Modified GCC for the Vhex kernel projet
This project was born following the discovery of a limitation with GCC on the SuperH architecture see on this subject from few years ago:
The generation of dynamic libraries is blocked by GCC (the --shared flag is
ignored), because the sh3eb-elf target (the one used for cross-compiling on
Casio calculators), does not support this functionality.
I am currently building a kernel for Casio's calculator for a graduation
project and I need this functionality. I had discovered, thanks to
Lephenixnoir,
that we could generate 'shared' libraries by using directly ld with a custom
linker script, but this workaround was of short duration. Indeed, we are
dependent on a library called libgcc, which provides some useful critical
primitives and is generated only in static (therefore with
non-relocatable code) which breaks all shared object files generated with this
dependency (and a lot of cases can involve this library).
With the help of Lephenixnoir, we tried to add a target for the
superH architecture called sh-elf-vhex, allowing us to enable these features
and that's what we finally came up with.
This repository gathers only the files that we had to modify for
binutils and GCC, as well as scripts to automate the installation of this
particular GCC.
- only C is supported
- only big endian encoding is supported
- we use the
stdintheader fromnewlib. Otherwise, the generation ofstdint.his incomplete - we only target the
SH4A-NOFPUprocessor (no backward compatibility with the SH3 assembler) - each public symbol begins with an underscore
- by default, we link our own C library to each generation of object files
- we do not provide a specialized default linker script (for the moment)
- compilation of the shared libgcc (
t-slibgcc) - compilation of the libgcc in PIC (
t-libgcc-pic) - compilation of the library for emulated floating point numbers (
t-softfp)
The build is relatively simple and can be done in two different ways:
Using curl:
curl -fsSL https://raw.githubusercontent.com/YannMagnin/sh-elf-vhex/HEAD/scripts/install.sh | bashNote that you can do the uninstallation using curl too:
curl -fsSL https://raw.githubusercontent.com/YannMagnin/sh-elf-vhex/HEAD/scripts/uninstall.sh | bashOr by cloning the project and using the install.sh script, see
./scripts/install.sh --help for more information about possible operations
you can do with it
cd /tmp/
git clone 'https://github.com/YannMagnin/sh-elf-vhex.git' --depth=1
cd /tmp/sh-elf-vhex || exit 1
./script/install.shIt takes about twenty minutes for the build.
Do not forget to add the install prefix (~/.local/bin) path to your PATH
environment variable:
Warning
You must add the absolute path to your PATH environment variable
# *unix-like
export PATH="$PATH:/home/<your_login>/.local/bin"
# macos (darwin-like)
export PATH="$PATH:/Users/<your_login>/.local/bin"Note that GCC 12.x will never be supported since many critical bugs have
been found for the superh backend
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106609)
- GCC
14.1.0and binutils2.42 - GCC
13.2.0and binutils2.41 - GCC
11.2.0and binutils2.31
The bootstrap process will clone this repository at
~/.local/share/sh-elf-vhex then will start the installation using:
prefix-clone=~/.local/share/sh-elf-vhexprefix-sysroot=~/.local/share/sh-elf-vhex/_sysrootprefix-install=~/.local/bin/
The project also automatically installs vxOpenLibm and vxLibc
A big thanks to Lephenixnoir who helped me a lot for the modification of the sources and made this project possible!