This document aims to guide the reader to creating their own mips-linux-uclibc toolchain using tools provided by Gentoo linux. The versions and configurations used here are not totally vanilla and thus need more hands-on involvement than just running a long magic command.
Resulting (stage 3) toolchain will contain following versions of various packages (excluding Gentoo revisions):
gcc-6.4.0C-compiler (different/more recent version may probably be used freely)binutils-2.29.1(different/more recent version may probably be used freely)uclibc-0.9.33.2(must mostly match TARGET uclibc version)linux-headers-2.6.10(must mostly match TARGET kernel version)
Caveat:
Originally the TARGET would have needed uclibc-0.9.30 but as that does not work with recent binutils and
sufficiently old version (i.e. binutils-0.20) is not easily found, 0.9.33.2 is used here.
It may work with 0.9.30 libc on TARGET, but ymmv.
This documentation is licensed under CC-BY-SA-4.0.
The files/1-makefile.patch is licensed under GNU General Public License 2.
- mips1 TARGET CPU. (mips1..mips4 and mips32..mips32r5 probably work.)
- Gentoo linux HOST with root shell.
sudoworks too if that is installed and preferred. All commands here are to be run as root unless otherwise noted. sys-devel/crossdev. Version20171230is used in this guide, more recent may work, ymmv.
sys-devel/binutilsis at version2.29.1-r1, andsys-libs/binutils-libshas same ('ish) or more recent version.- Portage contains
sys-libs/uclibc-0.9.33.2-r15. The0.9.33.9999version can also be used. - The HOST Gentoo has local portage overlay configured. If not, follow Defining a custom repository in Gentoo handbook.
The required 2.6.10 is not found on portage anymore, but 2.4.36 still is.
Here we use that as a base for the required 2.6.10 version.
# Prepare category, package and aux files directories.
cd /usr/local/portage
mkdir -p sys-kernel/linux-headers/files
# Copy ebuild from portage for base.
cd sys-kernel/linux-headers
cp -av /usr/portage/sys-kernel/linux-headers/linux-headers-2.4.36.ebuild ./linux-headers-2.6.10.ebuildNext we need a patch file to fix the linux-headers-2.6.10 source package.
The 1-makefile.patch (in raw form) must be copied in the previously created files-directory,
or more specifically, into /usr/local/portage/sys-kernel/linux-headers/files .
After that, the 2.6.10 ebuild must be modified of few variables so that the patch is actually applied,
and no other patches are tried, and that the package is actually supported on mips:
H_SUPPORTEDARCH="alpha amd64 arm m68k mips ppc sh sparc x86"
PATCHES_V=""
SRC_URI="${KERNEL_URI}"
UNIPATCH_LIST="${FILESDIR}/1-makefile.patch"
To finish this step, build Manifest of the ebuild, patch, and source package (which is downloaded automatically):
ebuild linux-headers-2.6.10.ebuild digestCheckup: Ensure that running the find-command below results in list below (order may vary).
This may be done as regular user.
$ find /usr/local/portage/sys-kernel
/usr/local/portage/sys-kernel
/usr/local/portage/sys-kernel/linux-headers
/usr/local/portage/sys-kernel/linux-headers/linux-headers-2.6.10.ebuild
/usr/local/portage/sys-kernel/linux-headers/files
/usr/local/portage/sys-kernel/linux-headers/files/1-makefile.patch
/usr/local/portage/sys-kernel/linux-headers/Manifest
By the time of writing this, the uclibc-0.9.* ebuilds are not working correctly, due a bug.
Fortunately, the ticket contains a fix in comment #5.
Download that attachment (named uclibc.ebuild-001-mips.patch) to somewhere, e.g. /tmp
# Prepare category and package directories.
cd /usr/local/portage
mkdir -p sys-libs/uclibc
# Copy ebuild from portage for base.
cd sys-libs/uclibc
cp -av /usr/portage/sys-libs/uclibc/uclibc-0.9.33.2-r15.ebuild .
# Apply the patch.
patch -p1 --no-backup-if-mismatch < /tmp/uclibc.ebuild-001-mips.patch
# Create The Manifest.
ebuild uclibc-0.9.33.2-r15.ebuild digest
# These commands are **optional**, only relevant if you want to use uclibc-0.9.33.9999
cp -av /usr/portage/sys-libs/uclibc/uclibc-0.9.33.9999.ebuild .
sed -e 's/0.9.33.2-r15/0.9.33.9999/;' /tmp/uclibc.ebuild-001-mips.patch > /tmp/uclibc.ebuild-001-mips-9999.patch
patch -p1 --no-backup-if-mismatch < /tmp/uclibc.ebuild-001-mips-9999.patch
ebuild uclibc-0.9.33.9999.ebuild digestCheckup: As before, ensure stuff are in correct places. The actual ebuilds may differ if optional steps were followed in above snippet.
$ find /usr/local/portage/sys-libs
/usr/local/portage/sys-libs/
/usr/local/portage/sys-libs/uclibc
/usr/local/portage/sys-libs/uclibc/uclibc-0.9.33.2-r15.ebuild
/usr/local/portage/sys-libs/uclibc/Manifest
Ebuilds prepared we can now use the Gentoo Cross-toolchain generator aka crossdev to build the toolchain.
For gcc we disable PIE (although this may not be required).
For uclibc we disable nptl as there seems to not be support for it in mips.
Please note of the amount of dashes, equal signs and hyphens.
# Create mips-example-linux-uclibc toolchain.
# You may replace the "example" vendor field to something meaningful.
# If you decided to use uclibc-0.9.33.9999, replace the
# version on --l line (still keeping the equal sign).
crossdev \
-ol /usr/local/portage \
-ok /usr/local/portage \
-s3 \
--genv 'USE=-pie' \
--lenv 'USE=-nptl' \
--b =2.29.1-r1 \
--l =0.9.33.2-r15 \
--k =2.6.10 \
--g =6.4.0-r1 \
--target mips-example-linux-uclibc
# You may add arguments -P -v to above command to see portage build output realtime.
# Otherwise, follow the logs in /var/log/portage/.-oland-okguide crossdev to read libc and kernel-/linux-headers ebuilds from given overlay (instead of Gentoo portage), as we just created thoose.-s3makes crossdev to build stage3 toolchain containing binutils (-s0), gcc (-s1), kernel headers (-s2) and libc (-s3).--genvand--lenvadds environment variables to gcc and libc build processes, respectively.--bdeclares binutils ebuild version to use.--ldeclares libc ebuild version to use.--kdeclares linux-headers ebuild version to use.--gdeclares gcc ebuild version to use.--target mips-example-linux-uclibcdeclares the toolchain name in form ARCH-VENDOR-OS-LIBC [crossdev --help].- Optional
-P -vadds-vto portage command line, giving verbose output from the build process.
The command creates a new category cross-mips-example-linux-uclibc in the portage for the cross-toolchain located
in the local overlay: /usr/local/portage/cross-mips-example-linux-uclibc .
The new sysroot resides in /usr/mips-example-linux-uclibc .
Files in the installed packages can be seen with equery files as usual, but the cross-category should be included
in the requested name, e.g. equery files cross-mips-example-linux-uclibc/gcc
(equery tool belongs to app-portage/gentoolkit package).
Write into hello.c:
#include <stdio.h>
int main(void) {
printf("Hello World, MIPS!\n");
return 0;
}Then run the newly created compiler on the file:
mips-example-linux-uclibc-gcc -o hello hello.c
# or for static result:
mips-example-linux-uclibc-gcc -o hello -static hello.cThen copy the resulting ELF binary to the MIPS machine and run it.
To remove the installed toolchain parts, the toolchain portage package category and configuration files related to the toolchain, run following:
crossdev --clean mips-example-linux-uclibc-gcc
# Previous command leaves two binaries behind (on crossdev-20171230). Remove them manually:
rm /usr/bin/mips-example-linux-uclibc-gcov-{dump,tool}This does not remove the self-created ebuilds in overlay, allowing to continue from Actual building later if needed.