|
2 months ago | |
---|---|---|
cmake | 2 months ago | |
patchs | 2 months ago | |
scripts | 2 months ago | |
.gitignore | 8 months ago | |
Makefile | 2 months ago | |
README.md | 1 year ago | |
vxsdk.toml | 2 months ago |
README.md
sh-elf-vhex - modified GCC for the Vhex kernel projet
Context
This project was born following the discovery of a limitation with GCC on the SuperH architecture see on this subject from 2 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 of a 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 provide some useful critical
primitives and which is generated only statically (therefore with
non-relocatable code), which broke all shared object file generated with this
dependencie (and a lot of cases can involve this librarie).
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.
Build
The build is relatively simple and can be done in two different ways: you can
use the compile.sh
script which is at the root of the repository:
./compile /your/installation/path
Or you can use the giteapc
tool, created by Lephenixnoir:
giteapc install sh-elf-vhex
It takes about twenty minutes for the build.
Technical notes
The GCC build takes much longer than the sh3eb-elf
target because we have two
stages for the GCC build. In order, we have:
- download + configuration of binutils sources
- download + configuration of GCC sources
- compilation of binutils
- compilation of GCC (stage-1) without enabling the shared library functionality
- compilation of OpenLibM (a dependency of our standard C library)
- compilation of fxlibc, our custom C standard library
- compilation of GCC (stage-2) with activation of the shared library fonctionality
- installation of our C library
- compilation of the shared libgcc
As for the details of the sh-elf-vhex
target that we created:
- machine-specific features:
- (
t-slibgcc
) compilation of the shared libgcc - (
t-libgcc-pic
) the compilation of the libgcc in PIC - (
t-fdpbit
) compilation of the library for emulated floating point numbers
- (
- global configuration:
- only C is supported
- only big endian encoding is supported
- we use the stdint header from
newlib
. Otherwise, the generation ofstdint.h
is incomplete - we only target the SH4A-NOFPU processor (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 an object file
- we do not provide a specialized default linker script (for the moment)
Special thanks
A big thanks to Lephenixnoir who helped me a lot for the modification of the sources and made this project possible!