Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Using musl-based toolchain #5

Open
JakubVanek opened this issue Mar 12, 2020 · 5 comments
Open

Using musl-based toolchain #5

JakubVanek opened this issue Mar 12, 2020 · 5 comments

Comments

@JakubVanek
Copy link

Hi all,

I've recently discovered musl and a simple script to build a musl-based toolchain: https://github.com/richfelker/musl-cross-make

I've tried building that toolchain for armv5-linux-musleabi and it successfully statically compiled EV3-API and a test program. The resulting program then ran on the brick OK.

I think it might be worth looking into it as the toolchain setup looks much simpler - in the basic mode, it is just a single command (make TARGET=armv5-linux-musleabi).

Best regards,

Jakub

@JakubVanek
Copy link
Author

Using richfelker/musl-cross-make#90 as a base, the following config.mak should work:

TARGET = armv5-linux-musleabi

OUTPUT = /home/kuba/musl-ev3

BINUTILS_VER = 2.33.1
GCC_VER   = 8.4.0
MUSL_VER  = 1.2.0
GMP_VER   = 6.1.2
MPC_VER   = 1.1.0
MPFR_VER  = 4.0.2
ISL_VER   = 0.21
LINUX_VER = headers-4.19.88

COMMON_CONFIG += CFLAGS="-g0 -Os" CXXFLAGS="-g0 -Os" LDFLAGS="-s"
COMMON_CONFIG += --disable-nls
COMMON_CONFIG += --with-debug-prefix-map=$(CURDIR)=

GCC_CONFIG += --disable-libquadmath --disable-decimal-float --disable-fixed-point
GCC_CONFIG += --disable-libgomp --disable-libitm
GCC_CONFIG += --with-cpu=arm926ej-s --enable-lto
GCC_CONFIG += --enable-languages=c,c++
GCC_CONFIG += --disable-shared
MUSL_CONFIG += --disable-shared
TOOLCHAIN_CONFIG += --with-pkgversion="C4EV3.Toolchain musl-gcc 8.4.0" --with-bugurl="https://github.com/c4ev3/C4EV3.Toolchain/issues/new"

@JakubVanek
Copy link
Author

Wow, it seems that even external toolchains could be used:

At least the Linux one works for me (if the final program is staticaly linked using -static).

@a3f
Copy link
Member

a3f commented Mar 13, 2020

Can you build something against the Linux v2.6.33-rc4 headers? I don't mind shipping musl instead as long it has the correct headers. But with your current setup, you can write code that compiles fine because the headers are there, but it will crash at runtime, because the old EV3 kernel doesn't support these interfaces.

@JakubVanek
Copy link
Author

It seems that this could be done ad-hoc: https://www.openwall.com/lists/musl/2016/12/06/4
Musl itself apparently doesn't need kernel headers for its build and operation: https://unix.stackexchange.com/a/528918

However apart from patches, the change to v2.6.33-rc4 should be relatively easy to make - it is just necessary to add the hash to the hashes directory.

@JakubVanek
Copy link
Author

Hmmmm, it seems that the older kernel headers aren't going to work with musl 1.2.0 :/
richfelker/musl-cross-make@1645ae3#diff-ad13e3e85208780288a2389c791b5c03

The time64_t changes are new to musl 1.2.0, so downgrading to 1.1.24 may fix this (if we really need the old headers, or if we need them at all).

I've been successful in building a portable Linux toolchain (using a portable portable-building toolchain) with the 2.6.33 headers (and musl 1.2.0, so it may not work well). It can be downloaded here.

Hash file for the linux kernel sources:

diff --git a/hashes/linux-2.6.33.tar.xz.sha1 b/hashes/linux-2.6.33.tar.xz.sha1
new file mode 100644
index 0000000..12b6fb6
--- /dev/null
+++ b/hashes/linux-2.6.33.tar.xz.sha1
@@ -0,0 +1 @@
+3e1993b30afc6c6f2d801942c88259b5e1626fa7  linux-2.6.33.tar.xz

config.mak:

#HOST   = i686-linux-musl
TARGET = armv5-linux-musleabi

OUTPUT = /home/kuba/musl-ev3

BINUTILS_VER = 2.33.1
GCC_VER      = 8.4.0
MUSL_VER     = 1.2.0
GMP_VER      = 6.1.2
MPC_VER      = 1.1.0
MPFR_VER     = 4.0.2
ISL_VER      = 0.21
LINUX_VER    = 2.6.33

COMMON_CONFIG += CC="i686-linux-musl-gcc -static --static" CXX="i686-linux-musl-g++ -static --static"
COMMON_CONFIG += CFLAGS="-g0 -Os" CXXFLAGS="-g0 -Os" LDFLAGS="-s"
COMMON_CONFIG += --disable-nls
COMMON_CONFIG += --with-debug-prefix-map=$(CURDIR)=
COMMON_CONFIG += --with-pkgversion="C4EV3.Toolchain musl-gcc 8.4.0" --with-bugurl="https://github.com/c4ev3/C4EV3.Toolchain/issues/new"

GCC_CONFIG += --disable-host-shared
GCC_CONFIG += --disable-libquadmath --disable-decimal-float --disable-fixed-point
GCC_CONFIG += --disable-libgomp --disable-libitm
GCC_CONFIG += --with-cpu=arm926ej-s --enable-lto
GCC_CONFIG += --enable-languages=c,c++
GCC_CONFIG += --disable-shared
MUSL_CONFIG += --disable-shared

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants