* odd endianness toolchains for crosstool
@ 2022-04-25 1:39 Jason A. Donenfeld
2022-04-25 8:46 ` Arnd Bergmann
` (2 more replies)
0 siblings, 3 replies; 17+ messages in thread
From: Jason A. Donenfeld @ 2022-04-25 1:39 UTC (permalink / raw)
To: arnd, linux-kernel
Hey Arnd,
I'm again experimenting with switching to your crosstool toolchains for
WireGuard's CI. I've hit a few snags in the process:
- For powerpc, gcc needs to be built with `--enable-secureplt
--with-long-double-64` in order for musl to run.
- Need powerpc64le compiler (-mabi=elfv2).
- Need mipsel compiler.
- Need aarch64_be compiler.
- Need armeb compiler.
- Need mips64el compiler.
While the existing compilers can all produce code for the wrong endian,
they hit trouble when trying to link against libgcc. So generally a
separate full toolchain is supplied for the less common endians.
I have had success with arm, arm64, mips, x86_64, i386, m68k. If you're
up for adding the above compilers to the collection, I'd be able to
complete the transition, and then look into adding a few more
architectures.
Jason
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2022-04-25 1:39 odd endianness toolchains for crosstool Jason A. Donenfeld
@ 2022-04-25 8:46 ` Arnd Bergmann
2022-04-25 11:43 ` Jason A. Donenfeld
2022-04-28 6:43 ` Rob Landley
2024-08-29 15:51 ` Jason A. Donenfeld
2 siblings, 1 reply; 17+ messages in thread
From: Arnd Bergmann @ 2022-04-25 8:46 UTC (permalink / raw)
To: Jason A. Donenfeld
Cc: Arnd Bergmann, Linux Kernel Mailing List, Nick Desaulniers
On Mon, Apr 25, 2022 at 3:39 AM Jason A. Donenfeld <Jason@zx2c4.com> wrote:
>
> Hey Arnd,
>
> I'm again experimenting with switching to your crosstool toolchains for
> WireGuard's CI. I've hit a few snags in the process:
>
> - For powerpc, gcc needs to be built with `--enable-secureplt
> --with-long-double-64` in order for musl to run.
> - Need powerpc64le compiler (-mabi=elfv2).
> - Need mipsel compiler.
> - Need aarch64_be compiler.
> - Need armeb compiler.
> - Need mips64el compiler.
>
> While the existing compilers can all produce code for the wrong endian,
> they hit trouble when trying to link against libgcc. So generally a
> separate full toolchain is supplied for the less common endians.
Hi Jason,
I'm definitely interested in improving the user space testing, and I agree
we need the powerpc64le and mipsel targets at the minimum for that.
The situation on my end is that I'm planning to migrate my main workstation
(which I'm building the compilers on) to an arm64 machine soon, and
will then need to set it all up again. I don't really want to change much before
then to avoid changing things twice.
I've added Nick to Cc, as he's experimenting with a clang based toolchain
that we can put on kernel.org along with the gcc toolchains, and that
would probably include a musl based sysroot roughly the same set of
architectures that you are testing on already. Possibly we could reuse the
same user space between clang and gcc.
> I have had success with arm, arm64, mips, x86_64, i386, m68k. If you're
> up for adding the above compilers to the collection, I'd be able to
> complete the transition, and then look into adding a few more
> architectures.
I've also looked at other projects that do qemu based testing, everyone
seems to be missing one or two architectures out of a common set,
https://tinyurl.com/linux-architectures is where I keep my data.
The most common subset of architectures that get tested as far
as I can tell is x86, arm64, powerpc, arm, riscv, mips, s390: those
are the ones that support all the important pieces (gcc, clang, musl,
glibc, qemu, debian and buildroot) and that have the most users.
The exceptions to this are I think:
* your wireguard tests are missing riscv and s390 tests, those should
be easy to add. You do support m68k, which the others are missing
* kunit is missing mips tests, but has alpha and sparc
* tuxrun[1] adds sparc64, sh4 and armv5 (softfp), could add rv32
* Günter's linux-build-test[2] has all the above, plus microblaze,
nios2, parisc, shbe, and xtensa
What I'd really like to see is to have the necessary information for
building and running the most common subset of these in one place
in the kernel tree where at least wireguard, kunit and tuxrun can
share the setup for qemu. One idea I had was to encode the
platform specific qemu command line options using Kconfig
dependencies in a way that "make O=obj ARCH=foo defconfig zImage;
obj/run-qemu" results in a booting kernel on a lot of the typical
defconfigs for supported architectures.
Arnd
[1] https://gitlab.com/Linaro/tuxrun/-/blob/master/tuxrun/devices/qemu.py
[2] https://github.com/groeck/linux-build-test/tree/master/rootfs
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2022-04-25 8:46 ` Arnd Bergmann
@ 2022-04-25 11:43 ` Jason A. Donenfeld
2022-04-25 14:55 ` Arnd Bergmann
0 siblings, 1 reply; 17+ messages in thread
From: Jason A. Donenfeld @ 2022-04-25 11:43 UTC (permalink / raw)
To: Arnd Bergmann; +Cc: Linux Kernel Mailing List, Nick Desaulniers
Hi Arnd,
On Mon, Apr 25, 2022 at 10:46:45AM +0200, Arnd Bergmann wrote:
> The situation on my end is that I'm planning to migrate my main workstation
> (which I'm building the compilers on) to an arm64 machine soon, and
> will then need to set it all up again. I don't really want to change much before
> then to avoid changing things twice.
Ahh, okay, so probably crosstool won't be viable for me for a while. Are
your existing scripts fairly reproducible and easy? I suppose I could
just build my own if I can't find another project supplying light
compilers.
> I've added Nick to Cc, as he's experimenting with a clang based toolchain
> that we can put on kernel.org along with the gcc toolchains, and that
> would probably include a musl based sysroot roughly the same set of
> architectures that you are testing on already. Possibly we could reuse the
> same user space between clang and gcc.
I personally have no use for compilers with user spaces. My test harness
builds musl as part of it. It's really the quickest part of the entire
harness to build. I also probably won't switch things over to clang;
Google has the resources to do that themselves. Basically all I need is
the boring nolibc compilers for a few extra platforms, and for the ppc
one to build with the mentioned flags.
> I've also looked at other projects that do qemu based testing, everyone
> seems to be missing one or two architectures out of a common set,
> https://tinyurl.com/linux-architectures is where I keep my data.
If the compilers are there, and they can build a working musl, and QEMU
will boot it, and I can work out a minimal kernel .config that doesn't
take a long time to compile, then it'll get included in the CI. So in
theory, I should be able to expand the portfolio of architectures I'm
using.
> building and running the most common subset of these in one place
> in the kernel tree where at least wireguard, kunit and tuxrun can
> share the setup for qemu.
I have little interest in that kind of abstraction unfortunately.
WireGuard's test suite is optimized for building minimal kernels that
exercise its functionality. Tons of emphasis is placed on those kernels
being minimal. And the userspaces too. The whole thing needs to compile
fast and boot fast. Perhaps megacorps can afford to throw massive
clusters at this, but I'm trying to test every single commit across 10
or so trees on every architecture that I can, from one box. Plus, I use
this when developing on my laptop. If it takes forever to build and if I
can't iterate fast on it, then it's simply not useful for me (or for
other various contributors who have been able to quickly pick up the
WireGuard test suite for development without a lot of futzing). So for
that reason, I don't see a lot of promise in making a monster
abstraction layer that does all the things. Plus, the more people who
invent the wheel (which is not even a particularly interesting wheel)
the more odd configurations and bugs we'll surface.
Jason
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2022-04-25 11:43 ` Jason A. Donenfeld
@ 2022-04-25 14:55 ` Arnd Bergmann
2022-04-25 15:20 ` Jason A. Donenfeld
0 siblings, 1 reply; 17+ messages in thread
From: Arnd Bergmann @ 2022-04-25 14:55 UTC (permalink / raw)
To: Jason A. Donenfeld
Cc: Arnd Bergmann, Linux Kernel Mailing List, Nick Desaulniers
On Mon, Apr 25, 2022 at 1:43 PM Jason A. Donenfeld <Jason@zx2c4.com> wrote:
> On Mon, Apr 25, 2022 at 10:46:45AM +0200, Arnd Bergmann wrote:
> > The situation on my end is that I'm planning to migrate my main workstation
> > (which I'm building the compilers on) to an arm64 machine soon, and
> > will then need to set it all up again. I don't really want to change much before
> > then to avoid changing things twice.
>
> Ahh, okay, so probably crosstool won't be viable for me for a while. Are
> your existing scripts fairly reproducible and easy? I suppose I could
> just build my own if I can't find another project supplying light
> compilers.
The scripts are fairly solid, but the original git tree is no longer available
and my version has a couple of local changes with a bit of a dirty history
from adding support for cross-compiling the compilers themselves to
do the canadian-cross arm64 and ppc64le hosted ones.
There is another fork of the same tree on
https://github.com/nathanchance/buildall
The main issue with building distributable binaries is to actually build
them on an older rootfs to avoid linking against a newer glibc, and
to ensure the dependencies for gcc are statically linked. Without that,
the output is too distro specific.
> > I've added Nick to Cc, as he's experimenting with a clang based toolchain
> > that we can put on kernel.org along with the gcc toolchains, and that
> > would probably include a musl based sysroot roughly the same set of
> > architectures that you are testing on already. Possibly we could reuse the
> > same user space between clang and gcc.
>
> I personally have no use for compilers with user spaces. My test harness
> builds musl as part of it. It's really the quickest part of the entire
> harness to build. I also probably won't switch things over to clang;
> Google has the resources to do that themselves. Basically all I need is
> the boring nolibc compilers for a few extra platforms, and for the ppc
> one to build with the mentioned flags.
I suppose the only thing you are missing is libgcc (or libcompiler-rt)
for those platforms. I had a closer look into what is or can be included
here, and I see that my builds include multiple versions on some of
the architectures, but not on others:
aarch64-linux/lib/gcc/aarch64-linux/11.1.0/libgcc.a
alpha-linux/lib/gcc/alpha-linux/11.1.0/libgcc.a
arc-linux/lib/gcc/arc-linux/11.1.0/libgcc.a
arc-linux/lib/gcc/arc-linux/11.1.0/hs/libgcc.a
arc-linux/lib/gcc/arc-linux/11.1.0/archs/libgcc.a
arc-linux/lib/gcc/arc-linux/11.1.0/hs38/libgcc.a
arc-linux/lib/gcc/arc-linux/11.1.0/hs38_linux/libgcc.a
arc-linux/lib/gcc/arc-linux/11.1.0/arc700/libgcc.a
arc-linux/lib/gcc/arc-linux/11.1.0/nps400/libgcc.a
arm-linux-gnueabi/lib/gcc/arm-linux-gnueabi/11.1.0/libgcc.a
...
powerpc-linux/lib/gcc/powerpc-linux/11.1.0/libgcc.a
powerpc-linux/lib/gcc/powerpc-linux/11.1.0/64/libgcc.a
powerpc-linux/lib/gcc/powerpc-linux/11.1.0/64/le/libgcc.a
powerpc-linux/lib/gcc/powerpc-linux/11.1.0/le/libgcc.a
powerpc-linux/lib/gcc/powerpc-linux/11.1.0/32/le/libgcc.a
powerpc64-linux/lib/gcc/powerpc64-linux/11.1.0/libgcc.a
powerpc64-linux/lib/gcc/powerpc64-linux/11.1.0/32/libgcc.a
powerpc64-linux/lib/gcc/powerpc64-linux/11.1.0/32/le/libgcc.a
powerpc64-linux/lib/gcc/powerpc64-linux/11.1.0/le/libgcc.a
powerpc64-linux/lib/gcc/powerpc64-linux/11.1.0/64/le/libgcc.a
mips-linux/lib/gcc/mips-linux/11.1.0/libgcc.a
mips-linux/lib/gcc/mips-linux/11.1.0/n32/libgcc.a
mips-linux/lib/gcc/mips-linux/11.1.0/64/libgcc.a
mips64-linux/lib/gcc/mips64-linux/11.1.0/libgcc.a
mips64-linux/lib/gcc/mips64-linux/11.1.0/32/libgcc.a
mips64-linux/lib/gcc/mips64-linux/11.1.0/64/libgcc.a
So on powerpc, there are already both big-endian and
little-endian binaries, but arm and mips only have one of the
two. I asked our local compiler experts, and they suggested
that one can add further multiarch-configs like the one
in gcc/config/arm/t-aprofile to allow building for a different
subset of the hundreds of possible configurations.
the t-aprofile builds libgcc for a couple of combinations of
cpu architecture level and FPU ABIs, but they are all the
same endianess. gcc/config/rs6000/t-linux64lebe is the
corresponding file for powerpc that enables all combinations
of 32/64 and be/le.
> > I've also looked at other projects that do qemu based testing, everyone
> > seems to be missing one or two architectures out of a common set,
> > https://tinyurl.com/linux-architectures is where I keep my data.
>
> If the compilers are there, and they can build a working musl, and QEMU
> will boot it, and I can work out a minimal kernel .config that doesn't
> take a long time to compile, then it'll get included in the CI. So in
> theory, I should be able to expand the portfolio of architectures I'm
> using.
Adding riscv and s390 should indeed be fairly simple to add,
and you can probably just take a look at what ktest does for them.
You have a good point about the minimal kernel config, which makes
sense for testing a single thing, but of course others generally want
to test a 'defconfig' build that is closer to what users would actually
run.
> > building and running the most common subset of these in one place
> > in the kernel tree where at least wireguard, kunit and tuxrun can
> > share the setup for qemu.
>
> I have little interest in that kind of abstraction unfortunately.
Ok, fair enough.
Arnd
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2022-04-25 14:55 ` Arnd Bergmann
@ 2022-04-25 15:20 ` Jason A. Donenfeld
2022-04-25 15:39 ` Arnd Bergmann
0 siblings, 1 reply; 17+ messages in thread
From: Jason A. Donenfeld @ 2022-04-25 15:20 UTC (permalink / raw)
To: Arnd Bergmann; +Cc: Linux Kernel Mailing List, Nick Desaulniers
Hey Arnd,
On Mon, Apr 25, 2022 at 04:55:20PM +0200, Arnd Bergmann wrote:
> I suppose the only thing you are missing is libgcc (or libcompiler-rt)
> for those platforms. I had a closer look into what is or can be included
> here, and I see that my builds include multiple versions on some of
> the architectures, but not on others:
>
> aarch64-linux/lib/gcc/aarch64-linux/11.1.0/libgcc.a
> alpha-linux/lib/gcc/alpha-linux/11.1.0/libgcc.a
> arc-linux/lib/gcc/arc-linux/11.1.0/libgcc.a
> arc-linux/lib/gcc/arc-linux/11.1.0/hs/libgcc.a
> arc-linux/lib/gcc/arc-linux/11.1.0/archs/libgcc.a
> arc-linux/lib/gcc/arc-linux/11.1.0/hs38/libgcc.a
> arc-linux/lib/gcc/arc-linux/11.1.0/hs38_linux/libgcc.a
> arc-linux/lib/gcc/arc-linux/11.1.0/arc700/libgcc.a
> arc-linux/lib/gcc/arc-linux/11.1.0/nps400/libgcc.a
> arm-linux-gnueabi/lib/gcc/arm-linux-gnueabi/11.1.0/libgcc.a
> ...
> powerpc-linux/lib/gcc/powerpc-linux/11.1.0/libgcc.a
> powerpc-linux/lib/gcc/powerpc-linux/11.1.0/64/libgcc.a
> powerpc-linux/lib/gcc/powerpc-linux/11.1.0/64/le/libgcc.a
> powerpc-linux/lib/gcc/powerpc-linux/11.1.0/le/libgcc.a
> powerpc-linux/lib/gcc/powerpc-linux/11.1.0/32/le/libgcc.a
> powerpc64-linux/lib/gcc/powerpc64-linux/11.1.0/libgcc.a
> powerpc64-linux/lib/gcc/powerpc64-linux/11.1.0/32/libgcc.a
> powerpc64-linux/lib/gcc/powerpc64-linux/11.1.0/32/le/libgcc.a
> powerpc64-linux/lib/gcc/powerpc64-linux/11.1.0/le/libgcc.a
> powerpc64-linux/lib/gcc/powerpc64-linux/11.1.0/64/le/libgcc.a
> mips-linux/lib/gcc/mips-linux/11.1.0/libgcc.a
> mips-linux/lib/gcc/mips-linux/11.1.0/n32/libgcc.a
> mips-linux/lib/gcc/mips-linux/11.1.0/64/libgcc.a
> mips64-linux/lib/gcc/mips64-linux/11.1.0/libgcc.a
> mips64-linux/lib/gcc/mips64-linux/11.1.0/32/libgcc.a
> mips64-linux/lib/gcc/mips64-linux/11.1.0/64/libgcc.a
>
> So on powerpc, there are already both big-endian and
> little-endian binaries, but arm and mips only have one of the
> two. I asked our local compiler experts, and they suggested
> that one can add further multiarch-configs like the one
> in gcc/config/arm/t-aprofile to allow building for a different
> subset of the hundreds of possible configurations.
>
> the t-aprofile builds libgcc for a couple of combinations of
> cpu architecture level and FPU ABIs, but they are all the
> same endianess. gcc/config/rs6000/t-linux64lebe is the
> corresponding file for powerpc that enables all combinations
> of 32/64 and be/le.
Right, exactly. So if you simply add little endian libgcc to ppc64, ppc,
mips, and mips64, and add big endian libgcc to arm and arm64, then we'd
be set. (And also, build ppc32 with --enable-secureplt
--with-long-double-64.)
Jason
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2022-04-25 15:20 ` Jason A. Donenfeld
@ 2022-04-25 15:39 ` Arnd Bergmann
2022-04-25 15:53 ` Jason A. Donenfeld
0 siblings, 1 reply; 17+ messages in thread
From: Arnd Bergmann @ 2022-04-25 15:39 UTC (permalink / raw)
To: Jason A. Donenfeld
Cc: Arnd Bergmann, Linux Kernel Mailing List, Nick Desaulniers
On Mon, Apr 25, 2022 at 5:20 PM Jason A. Donenfeld <Jason@zx2c4.com> wrote:
> Right, exactly. So if you simply add little endian libgcc to ppc64, ppc,
> mips, and mips64, and add big endian libgcc to arm and arm64, then we'd
> be set.
I see that gcc-11.3 was just released, so I should probably try
building that in the
near future. I'll see if I can manage to come up with multiarch
configs for that,
and maybe even get those merged upstream so I don't have to carry patches
against the gcc source tree (all the other builds are for unmodified sources).
I can probably do that before migrating to the new machine, but I can't
promise how quickly I find time to start.
> (And also, build ppc32 with --enable-secureplt --with-long-double-64.)
Can you explain what those are about? Is this related to the ELFv1
vs ELFv2 difference or something else? Is this needed in both the
ppc32 and ppc64 compilers that each come with both targets?
Arnd
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2022-04-25 15:39 ` Arnd Bergmann
@ 2022-04-25 15:53 ` Jason A. Donenfeld
2022-04-25 16:15 ` Arnd Bergmann
0 siblings, 1 reply; 17+ messages in thread
From: Jason A. Donenfeld @ 2022-04-25 15:53 UTC (permalink / raw)
To: Arnd Bergmann; +Cc: Linux Kernel Mailing List, Nick Desaulniers
Hi Arnd,
On Mon, Apr 25, 2022 at 05:39:34PM +0200, Arnd Bergmann wrote:
> I can probably do that before migrating to the new machine, but I can't
> promise how quickly I find time to start.
Oh awesome. Will keep my eye out for it.
> > (And also, build ppc32 with --enable-secureplt --with-long-double-64.)
>
> Can you explain what those are about? Is this related to the ELFv1
> vs ELFv2 difference or something else? Is this needed in both the
> ppc32 and ppc64 compilers that each come with both targets?
For 32-bit, it is required. From
<https://wiki.musl-libc.org/supported-platforms.html>:
powerpc (needs gcc built with --enable-secureplt
--with-long-double-64, and -Wl,--secure-plt to link dynamic
binaries.)
And from the INSTALL file it says:
* PowerPC
* Compiler toolchain must provide 64-bit long double, not IBM
double-double or IEEE quad
* For dynamic linking, compiler toolchain must be configured for
"secure PLT" variant
For 64-bit, I'm not sure, but I know that at least -mabi=elfv2 is required,
and I think --with-long-double-64 too, according to documentation:
* PowerPC64
* Both little and big endian variants are supported
* Compiler toolchain must provide 64-bit long double, not IBM
double-double or IEEE quad
* Compiler toolchain must use the new (ELFv2) ABI regardless of
whether it is for little or big endian
Taken from <https://git.musl-libc.org/cgit/musl/tree/INSTALL#n35>.
Jason
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2022-04-25 15:53 ` Jason A. Donenfeld
@ 2022-04-25 16:15 ` Arnd Bergmann
2022-04-25 17:01 ` Jason A. Donenfeld
0 siblings, 1 reply; 17+ messages in thread
From: Arnd Bergmann @ 2022-04-25 16:15 UTC (permalink / raw)
To: Jason A. Donenfeld
Cc: Arnd Bergmann, Linux Kernel Mailing List, Nick Desaulniers
On Mon, Apr 25, 2022 at 5:53 PM Jason A. Donenfeld <Jason@zx2c4.com> wrote:
>
> Hi Arnd,
>
> On Mon, Apr 25, 2022 at 05:39:34PM +0200, Arnd Bergmann wrote:
> > I can probably do that before migrating to the new machine, but I can't
> > promise how quickly I find time to start.
>
> Oh awesome. Will keep my eye out for it.
>
> > > (And also, build ppc32 with --enable-secureplt --with-long-double-64.)
> >
> > Can you explain what those are about? Is this related to the ELFv1
> > vs ELFv2 difference or something else? Is this needed in both the
> > ppc32 and ppc64 compilers that each come with both targets?
>
> For 32-bit, it is required. From
> <https://wiki.musl-libc.org/supported-platforms.html>:
>
> powerpc (needs gcc built with --enable-secureplt
> --with-long-double-64, and -Wl,--secure-plt to link dynamic
> binaries.)
>
> And from the INSTALL file it says:
>
> * PowerPC
> * Compiler toolchain must provide 64-bit long double, not IBM
> double-double or IEEE quad
> * For dynamic linking, compiler toolchain must be configured for
> "secure PLT" variant
>
> For 64-bit, I'm not sure, but I know that at least -mabi=elfv2 is required,
> and I think --with-long-double-64 too, according to documentation:
>
> * PowerPC64
> * Both little and big endian variants are supported
> * Compiler toolchain must provide 64-bit long double, not IBM
> double-double or IEEE quad
> * Compiler toolchain must use the new (ELFv2) ABI regardless of
> whether it is for little or big endian
Ok, I see. For all I can tell, the toolchain I built already uses both
--with-long-double-64
and --enable-secureplt, as those seemt to be the default for Linux.
Regarding the the ELF ABI, I'm not sure how to check, but I think it
only does ELFv1, which is the default for big-endian glibc.
Arnd
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2022-04-25 16:15 ` Arnd Bergmann
@ 2022-04-25 17:01 ` Jason A. Donenfeld
2022-04-25 17:20 ` Jason A. Donenfeld
2022-04-25 17:40 ` Arnd Bergmann
0 siblings, 2 replies; 17+ messages in thread
From: Jason A. Donenfeld @ 2022-04-25 17:01 UTC (permalink / raw)
To: Arnd Bergmann; +Cc: Linux Kernel Mailing List, Nick Desaulniers
Hi Arnd,
On Mon, Apr 25, 2022 at 06:15:07PM +0200, Arnd Bergmann wrote:
> On Mon, Apr 25, 2022 at 5:53 PM Jason A. Donenfeld <Jason@zx2c4.com> wrote:
> >
> > Hi Arnd,
> >
> > On Mon, Apr 25, 2022 at 05:39:34PM +0200, Arnd Bergmann wrote:
> > > I can probably do that before migrating to the new machine, but I can't
> > > promise how quickly I find time to start.
> >
> > Oh awesome. Will keep my eye out for it.
> >
> > > > (And also, build ppc32 with --enable-secureplt --with-long-double-64.)
> > >
> > > Can you explain what those are about? Is this related to the ELFv1
> > > vs ELFv2 difference or something else? Is this needed in both the
> > > ppc32 and ppc64 compilers that each come with both targets?
> >
> > For 32-bit, it is required. From
> > <https://wiki.musl-libc.org/supported-platforms.html>:
> >
> > powerpc (needs gcc built with --enable-secureplt
> > --with-long-double-64, and -Wl,--secure-plt to link dynamic
> > binaries.)
> >
> > And from the INSTALL file it says:
> >
> > * PowerPC
> > * Compiler toolchain must provide 64-bit long double, not IBM
> > double-double or IEEE quad
> > * For dynamic linking, compiler toolchain must be configured for
> > "secure PLT" variant
> >
> > For 64-bit, I'm not sure, but I know that at least -mabi=elfv2 is required,
> > and I think --with-long-double-64 too, according to documentation:
> >
> > * PowerPC64
> > * Both little and big endian variants are supported
> > * Compiler toolchain must provide 64-bit long double, not IBM
> > double-double or IEEE quad
> > * Compiler toolchain must use the new (ELFv2) ABI regardless of
> > whether it is for little or big endian
>
> Ok, I see. For all I can tell, the toolchain I built already uses both
> --with-long-double-64
> and --enable-secureplt, as those seemt to be the default for Linux.
For ppc32? I'm unable to produce working executables with the toolchain.
And looking at the target info, -msecure-plt is missing, while
-mlong-double-64 is there:
$ ./powerpc-linux-gcc -Q --help=target | grep long-double
-mlong-double- 64
$ ./powerpc-linux-gcc -Q --help=target | grep msecure-plt
-msecure-plt [disabled]
For ppc64, I see the same. I'll try to look into it more though.
> Regarding the the ELF ABI, I'm not sure how to check, but I think it
> only does ELFv1, which is the default for big-endian glibc.
Yes, it only is doing ELFv1 right now. musl checks this in
<https://git.musl-libc.org/cgit/musl/tree/configure#n689> with this:
trycppif "_CALL_ELF == 2" "$t" || fail "$0: error: unsupported powerpc64 ABI"
Jason
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2022-04-25 17:01 ` Jason A. Donenfeld
@ 2022-04-25 17:20 ` Jason A. Donenfeld
2022-04-25 17:40 ` Arnd Bergmann
1 sibling, 0 replies; 17+ messages in thread
From: Jason A. Donenfeld @ 2022-04-25 17:20 UTC (permalink / raw)
To: Arnd Bergmann; +Cc: Linux Kernel Mailing List, Nick Desaulniers
On Mon, Apr 25, 2022 at 07:01:57PM +0200, Jason A. Donenfeld wrote:
> For ppc32? I'm unable to produce working executables with the toolchain.
> And looking at the target info, -msecure-plt is missing, while
> -mlong-double-64 is there:
>
> $ ./powerpc-linux-gcc -Q --help=target | grep long-double
> -mlong-double- 64
> $ ./powerpc-linux-gcc -Q --help=target | grep msecure-plt
> -msecure-plt [disabled]
And looking at the actual sections of the binary, indeed the .plt
section is RWX, which means it's not getting -msecure-plt as it should.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2022-04-25 17:01 ` Jason A. Donenfeld
2022-04-25 17:20 ` Jason A. Donenfeld
@ 2022-04-25 17:40 ` Arnd Bergmann
2022-04-25 17:42 ` Jason A. Donenfeld
1 sibling, 1 reply; 17+ messages in thread
From: Arnd Bergmann @ 2022-04-25 17:40 UTC (permalink / raw)
To: Jason A. Donenfeld
Cc: Arnd Bergmann, Linux Kernel Mailing List, Nick Desaulniers
On Mon, Apr 25, 2022 at 7:01 PM Jason A. Donenfeld <Jason@zx2c4.com> wrote:
> On Mon, Apr 25, 2022 at 06:15:07PM +0200, Arnd Bergmann wrote:
> > On Mon, Apr 25, 2022 at 5:53 PM Jason A. Donenfeld <Jason@zx2c4.com> wrote:
> >
> > Ok, I see. For all I can tell, the toolchain I built already uses both
> > --with-long-double-64
> > and --enable-secureplt, as those seemt to be the default for Linux.
>
> For ppc32? I'm unable to produce working executables with the toolchain.
> And looking at the target info, -msecure-plt is missing, while
> -mlong-double-64 is there:
>
> $ ./powerpc-linux-gcc -Q --help=target | grep long-double
> -mlong-double- 64
> $ ./powerpc-linux-gcc -Q --help=target | grep msecure-plt
> -msecure-plt [disabled]
Ah, my mistake, I looked at the distro provided compiler instead of my own :(
> For ppc64, I see the same. I'll try to look into it more though.
>
> > Regarding the the ELF ABI, I'm not sure how to check, but I think it
> > only does ELFv1, which is the default for big-endian glibc.
>
> Yes, it only is doing ELFv1 right now. musl checks this in
> <https://git.musl-libc.org/cgit/musl/tree/configure#n689> with this:
>
> trycppif "_CALL_ELF == 2" "$t" || fail "$0: error: unsupported powerpc64 ABI"
Does it work if you pass -mabi=elfv2? This seems to be ignored here as well:
$ powerpc-linux-gcc -mlittle-endian -mabi=elfv2 -xc -c /dev/null -o /tmp/a.o
$ file /tmp/a.o
/tmp/a.o: ELF 32-bit LSB relocatable, PowerPC or cisco 4500, version 1
(SYSV), not stripped
Arnd
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2022-04-25 17:40 ` Arnd Bergmann
@ 2022-04-25 17:42 ` Jason A. Donenfeld
0 siblings, 0 replies; 17+ messages in thread
From: Jason A. Donenfeld @ 2022-04-25 17:42 UTC (permalink / raw)
To: Arnd Bergmann; +Cc: Linux Kernel Mailing List, Nick Desaulniers
Hi Arnd,
On Mon, Apr 25, 2022 at 7:40 PM Arnd Bergmann <arnd@arndb.de> wrote:
> > For ppc64, I see the same. I'll try to look into it more though.
> >
> > > Regarding the the ELF ABI, I'm not sure how to check, but I think it
> > > only does ELFv1, which is the default for big-endian glibc.
> >
> > Yes, it only is doing ELFv1 right now. musl checks this in
> > <https://git.musl-libc.org/cgit/musl/tree/configure#n689> with this:
> >
> > trycppif "_CALL_ELF == 2" "$t" || fail "$0: error: unsupported powerpc64 ABI"
>
> Does it work if you pass -mabi=elfv2? This seems to be ignored here as well:
>
> $ powerpc-linux-gcc -mlittle-endian -mabi=elfv2 -xc -c /dev/null -o /tmp/a.o
> $ file /tmp/a.o
> /tmp/a.o: ELF 32-bit LSB relocatable, PowerPC or cisco 4500, version 1
> (SYSV), not stripped
You're mixing things up I think. -mabi=elfv2 is what powerpc64 needs,
but I don't think powerpc32 has it.
If you try to add -mabi=elfv2 to your existing powerpc64 compiler, it
gets upset when linking to libgcc.
Jason
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2022-04-25 1:39 odd endianness toolchains for crosstool Jason A. Donenfeld
2022-04-25 8:46 ` Arnd Bergmann
@ 2022-04-28 6:43 ` Rob Landley
2024-08-29 15:51 ` Jason A. Donenfeld
2 siblings, 0 replies; 17+ messages in thread
From: Rob Landley @ 2022-04-28 6:43 UTC (permalink / raw)
To: Jason A. Donenfeld, arnd, linux-kernel
On 4/24/22 20:39, Jason A. Donenfeld wrote:
> Hey Arnd,
>
> I'm again experimenting with switching to your crosstool toolchains for
> WireGuard's CI. I've hit a few snags in the process:
>
> - For powerpc, gcc needs to be built with `--enable-secureplt
> --with-long-double-64` in order for musl to run.
> - Need powerpc64le compiler (-mabi=elfv2).
> - Need mipsel compiler.
> - Need aarch64_be compiler.
> - Need armeb compiler.
> - Need mips64el compiler.
https://landley.net/toybox/faq.html#cross2
https://landley.net/toybox/downloads/binaries/toolchains/latest/
They're all musl based. I use them to build little bootable systems under qemu
with a 300 line bash script:
https://landley.net/toybox/faq.html#mkroot
https://landley.net/toybox/downloads/binaries/mkroot/latest/
Ala:
https://github.com/landley/toybox/blob/master/scripts/mkroot.sh
Rob
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2022-04-25 1:39 odd endianness toolchains for crosstool Jason A. Donenfeld
2022-04-25 8:46 ` Arnd Bergmann
2022-04-28 6:43 ` Rob Landley
@ 2024-08-29 15:51 ` Jason A. Donenfeld
2024-08-29 20:25 ` Arnd Bergmann
2 siblings, 1 reply; 17+ messages in thread
From: Jason A. Donenfeld @ 2024-08-29 15:51 UTC (permalink / raw)
To: arnd, linux-kernel
Hey Arnd,
On Mon, Apr 25, 2022 at 03:39:27AM +0200, Jason A. Donenfeld wrote:
> Hey Arnd,
>
> I'm again experimenting with switching to your crosstool toolchains for
> WireGuard's CI. I've hit a few snags in the process:
>
> - For powerpc, gcc needs to be built with `--enable-secureplt
> --with-long-double-64` in order for musl to run.
> - Need powerpc64le compiler (-mabi=elfv2).
> - Need mipsel compiler.
> - Need aarch64_be compiler.
> - Need armeb compiler.
> - Need mips64el compiler.
>
> While the existing compilers can all produce code for the wrong endian,
> they hit trouble when trying to link against libgcc. So generally a
> separate full toolchain is supplied for the less common endians.
>
> I have had success with arm, arm64, mips, x86_64, i386, m68k. If you're
> up for adding the above compilers to the collection, I'd be able to
> complete the transition, and then look into adding a few more
> architectures.
>
> Jason
I decided to give it another look, seeing if I could replace my musl.cc
compilers with your crosstool ones.
The actual changes required weren't so bad:
https://git.zx2c4.com/wireguard-linux/commit/?h=update-toolchain
But there's not universal success:
x86_64 - good
i386 - good
arm - good
armeb - MISSING
aarch64 - good
aarch64_be - MISSING
mips - BROKEN (doesn't like -EB)
mipsel - MISSING
mips64 - BROKEN (doesn't like -EB)
mips64el - MISSING
powerpc64 - BROKEN (wrong powerpc ABI)
powerpc64le - MISSING
powerpc - BROKEN (builds but some binaries segfault)
m68k - good
riscv64 - good
riscv32 - good
s390 - BROKEN (should be called "s390x" instead)
um - kinda broken (but not crosstool's problem)
To try these, I've been running:
ARCH=aarch64 make -C tools/testing/selftests/wireguard/qemu -j$(nproc)
or similar, against this tree:
$ git clone -b update-toolchain https://git.zx2c4.com/wireguard-linux/
So it looks like it's not quite there, but not bad either. Just FYI in
case you're interested.
Jason
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2024-08-29 15:51 ` Jason A. Donenfeld
@ 2024-08-29 20:25 ` Arnd Bergmann
2024-09-03 1:23 ` Nathan Chancellor
0 siblings, 1 reply; 17+ messages in thread
From: Arnd Bergmann @ 2024-08-29 20:25 UTC (permalink / raw)
To: Jason A . Donenfeld, linux-kernel; +Cc: Nathan Chancellor
On Thu, Aug 29, 2024, at 17:51, Jason A. Donenfeld wrote:
> On Mon, Apr 25, 2022 at 03:39:27AM +0200, Jason A. Donenfeld wrote:
>
>
> I decided to give it another look, seeing if I could replace my musl.cc
> compilers with your crosstool ones.
>
> The actual changes required weren't so bad:
>
> https://git.zx2c4.com/wireguard-linux/commit/?h=update-toolchain
>
> But there's not universal success:
>
> x86_64 - good
> i386 - good
> arm - good
> armeb - MISSING
> aarch64 - good
> aarch64_be - MISSING
> mips - BROKEN (doesn't like -EB)
> mipsel - MISSING
> mips64 - BROKEN (doesn't like -EB)
> mips64el - MISSING
> powerpc64 - BROKEN (wrong powerpc ABI)
> powerpc64le - MISSING
> powerpc - BROKEN (builds but some binaries segfault)
> m68k - good
> riscv64 - good
> riscv32 - good
> s390 - BROKEN (should be called "s390x" instead)
> um - kinda broken (but not crosstool's problem)
>
> To try these, I've been running:
>
> ARCH=aarch64 make -C tools/testing/selftests/wireguard/qemu -j$(nproc)
>
> or similar, against this tree:
>
> $ git clone -b update-toolchain https://git.zx2c4.com/wireguard-linux/
>
> So it looks like it's not quite there, but not bad either. Just FYI in
> case you're interested.
I wonder if the ones you list as missing all work with Nathan's clang
builds from https://mirrors.edge.kernel.org/pub/tools/llvm/ instead.
As far as I can tell, the main missing bit here is libgcc, which
is not always built along with gcc for all possible targets.
The llvm replacement for libgcc is https://compiler-rt.llvm.org/,
and you may have to build that in addition to musl when you try it.
I don't know if compiler-rt also works with gcc, but if it does,
that should fix most of the ones that you report as failing above.
The only one that won't work at all is um because the x86 toolchain
is already unable to build a kernel for that.
Arnd
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2024-08-29 20:25 ` Arnd Bergmann
@ 2024-09-03 1:23 ` Nathan Chancellor
2024-09-03 6:59 ` Arnd Bergmann
0 siblings, 1 reply; 17+ messages in thread
From: Nathan Chancellor @ 2024-09-03 1:23 UTC (permalink / raw)
To: Arnd Bergmann; +Cc: Jason A . Donenfeld, linux-kernel
On Thu, Aug 29, 2024 at 10:25:32PM +0200, Arnd Bergmann wrote:
> On Thu, Aug 29, 2024, at 17:51, Jason A. Donenfeld wrote:
> > On Mon, Apr 25, 2022 at 03:39:27AM +0200, Jason A. Donenfeld wrote:
> >
> >
> > I decided to give it another look, seeing if I could replace my musl.cc
> > compilers with your crosstool ones.
> >
> > The actual changes required weren't so bad:
> >
> > https://git.zx2c4.com/wireguard-linux/commit/?h=update-toolchain
> >
> > But there's not universal success:
> >
> > x86_64 - good
> > i386 - good
> > arm - good
> > armeb - MISSING
> > aarch64 - good
> > aarch64_be - MISSING
> > mips - BROKEN (doesn't like -EB)
> > mipsel - MISSING
> > mips64 - BROKEN (doesn't like -EB)
> > mips64el - MISSING
> > powerpc64 - BROKEN (wrong powerpc ABI)
> > powerpc64le - MISSING
> > powerpc - BROKEN (builds but some binaries segfault)
> > m68k - good
> > riscv64 - good
> > riscv32 - good
> > s390 - BROKEN (should be called "s390x" instead)
> > um - kinda broken (but not crosstool's problem)
> >
> > To try these, I've been running:
> >
> > ARCH=aarch64 make -C tools/testing/selftests/wireguard/qemu -j$(nproc)
> >
> > or similar, against this tree:
> >
> > $ git clone -b update-toolchain https://git.zx2c4.com/wireguard-linux/
> >
> > So it looks like it's not quite there, but not bad either. Just FYI in
> > case you're interested.
>
> I wonder if the ones you list as missing all work with Nathan's clang
> builds from https://mirrors.edge.kernel.org/pub/tools/llvm/ instead.
>
> As far as I can tell, the main missing bit here is libgcc, which
> is not always built along with gcc for all possible targets.
> The llvm replacement for libgcc is https://compiler-rt.llvm.org/,
> and you may have to build that in addition to musl when you try it.
>
> I don't know if compiler-rt also works with gcc, but if it does,
> that should fix most of the ones that you report as failing above.
> The only one that won't work at all is um because the x86 toolchain
> is already unable to build a kernel for that.
I doubt my toolchains would fix this issue. As far as I am aware, only
the native compiler runtime is included, not any of the cross ones, as
the kernel itself does not use them. However, I suspect it would not be
too difficult to cross build compiler-rt standalone and stitch it into
my builds separately if desired.
FWIW, I have used your toolchains to build UML but maybe that is
environment dependent?
Cheers,
Nathan
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: odd endianness toolchains for crosstool
2024-09-03 1:23 ` Nathan Chancellor
@ 2024-09-03 6:59 ` Arnd Bergmann
0 siblings, 0 replies; 17+ messages in thread
From: Arnd Bergmann @ 2024-09-03 6:59 UTC (permalink / raw)
To: Nathan Chancellor; +Cc: Jason A . Donenfeld, linux-kernel
On Tue, Sep 3, 2024, at 01:23, Nathan Chancellor wrote:
> On Thu, Aug 29, 2024 at 10:25:32PM +0200, Arnd Bergmann wrote:
>> On Thu, Aug 29, 2024, at 17:51, Jason A. Donenfeld wrote:
>>
>> I wonder if the ones you list as missing all work with Nathan's clang
>> builds from https://mirrors.edge.kernel.org/pub/tools/llvm/ instead.
>>
>> As far as I can tell, the main missing bit here is libgcc, which
>> is not always built along with gcc for all possible targets.
>> The llvm replacement for libgcc is https://compiler-rt.llvm.org/,
>> and you may have to build that in addition to musl when you try it.
>>
>> I don't know if compiler-rt also works with gcc, but if it does,
>> that should fix most of the ones that you report as failing above.
>> The only one that won't work at all is um because the x86 toolchain
>> is already unable to build a kernel for that.
>
> I doubt my toolchains would fix this issue. As far as I am aware, only
> the native compiler runtime is included, not any of the cross ones, as
> the kernel itself does not use them. However, I suspect it would not be
> too difficult to cross build compiler-rt standalone and stitch it into
> my builds separately if desired.
Right, that's what I meant: building compiler-rt for all the
supported targets on clang should not be that hard, it would be
just another step on top of building musl. Doing the same for
gcc may be a different story as libgcc is not usually built as
a standalone library and compiler-rt may require building with
clang rather than gcc.
> FWIW, I have used your toolchains to build UML but maybe that is
> environment dependent?
Did you do that on x86? I only tried on arm64, where it is built
as a nolibc toolchain. Cross-building native x86 toolchains on arm64
is always tricky and I had expected that this would also be
a nolibc version, but it's possible that I accidentally built it
against the x86 glibc as well.
Arnd
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2024-09-03 8:06 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-04-25 1:39 odd endianness toolchains for crosstool Jason A. Donenfeld
2022-04-25 8:46 ` Arnd Bergmann
2022-04-25 11:43 ` Jason A. Donenfeld
2022-04-25 14:55 ` Arnd Bergmann
2022-04-25 15:20 ` Jason A. Donenfeld
2022-04-25 15:39 ` Arnd Bergmann
2022-04-25 15:53 ` Jason A. Donenfeld
2022-04-25 16:15 ` Arnd Bergmann
2022-04-25 17:01 ` Jason A. Donenfeld
2022-04-25 17:20 ` Jason A. Donenfeld
2022-04-25 17:40 ` Arnd Bergmann
2022-04-25 17:42 ` Jason A. Donenfeld
2022-04-28 6:43 ` Rob Landley
2024-08-29 15:51 ` Jason A. Donenfeld
2024-08-29 20:25 ` Arnd Bergmann
2024-09-03 1:23 ` Nathan Chancellor
2024-09-03 6:59 ` Arnd Bergmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox