On Tue, 2022-07-26 at 22:30 +0200, Olliver Schinagl
wrote:> Hey list,
> 
> I'm trying to cross-compile klibc on mips. As I packaged it for alpine 
> before, I figured it shouldn't be that hard ;) Sadly, alpine
doesn't
> support mips[32|64] so I have to cross-compile it.
Cross-compilation should work, and I regularly test this for all the
architectures that Debian provides cross-compilers for.
> I'm doing this from within an alpine based docker container, using a 
> simple script (setup vars, unzip, make).
> 
> 
> There's a few things I don't understand why they are the way they
are,
> but have a somewhat easy work-around (haven't spend time to figure out 
> if it is the correct one at all or not :p).
> 
> 
> First, this work-around I have also in the alpine packages, since it's 
> just shuffling stuff around, but keeping all definitions, I don't 
> mind/care much.
> 
> ```
> 
>  ?? ???? if [ ! -e 'usr/include/sys/sysinfo.h.orig' ]; then
>  ?? ???? ??? mv 'usr/include/sys/sysinfo.h' \
>  ?? ???? ??? ?? 'usr/include/sys/sysinfo.h.orig'
>  ?? ???? fi
>  ?? ???? cat \
>  ?? ???? ??? '/usr/include/linux/sysinfo.h' \
>  ?? ???? ??? 'usr/include/sys/sysinfo.h.orig' > \
>  ?? ???? ??? 'usr/include/sys/sysinfo.h'
> ```
This doesn't make any sense to me.  Our sys/sysinfo.h already includes
<linux/kernel.h>, which includes <linux/sysinfo.h>.
> 
> excuse the uglyness :p
> 
> 
> Secondly, specificaly on mips, I get re-definition errors, I haven't 
> looked into detail why `f_owner_ex` is redefined, but I use the 
> following here:
> 
> ```
> 
>  ?? ???? sed -i \
>  ?? ???? ??? -e '/^typedef struct flock {$/i # define 
> HAVE_ARCH_STRUCT_FLOCK/' \
>  ?? ???? ??? -e '/^struct f_owner_ex {$/,+6d' \
>  ?? ???? ??? 'usr/include/arch/mips/klibc/archfcntl.h'
> 
> ```
It's also defined in <asm/fcntl.h>, which I think is "wrong"
on MIPS.
We try to prevent including both <klibc/archfcntl.h> and
<asm/fcntl.h>,
though it looks like that check broke about 10 years ago in the UAPI
split!
> Lastly, _KLIBC_USE_RT_SIG supposedly 'can' be used on mips, but it 
> causes a `-1` unnamed array definition error, so 'can' means
'does not
> needed to be', so I just disabled it.
> 
> 
> ```
> 
>  ?? ???? sed -i 's|^\(#define _KLIBC_USE_RT_SIG \).*$|\1 0|' 
> 'usr/include/arch/mips/klibc/archconfig.h'
> 
> ```
This is not a configuration option.  You can't change it without
changing the architecture implementation too.
[...]> Now, to compile, I use
> 
> ```
> 
>  ?? ???? make \
>  ?? ???? ???? KBUILD_REPRODUCIBLE=1 \
>  ?? ???? ???? KLIBCARCH="mips" \
>  ?? ???? ???? KLIBCKERNELSRC='/usr/' \
>  ?? ???? ???? ;
> 
> ```
[...]
This causes klibc to use the kernel headers for the build machine's
architecture, which is wrong for cross-builds.  This is probably the
source of all or most of the errors.
If you have a working cross-compiler then it must have a copy of the
kernel headers for the target architecture installed somewhere, and you
need to tell klibc where that is or link to it.  I don't know how
Alpine packages cross-tools, but this is what we do in Debian:
https://salsa.debian.org/kernel-team/klibc/-/blob/master/debian/rules#L58
Ben.
-- 
Ben Hutchings
Larkinson's Law: All laws are basically false.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part
URL:
<https://lists.zytor.com/archives/klibc/attachments/20220801/9bd4fc9f/attachment.sig>