Christer Solskogen via Gcc-help kirjoitti 13.2.2023 klo 9.23:
On 12.02.2023 21:01, Kai Ruottu wrote:
Christer Solskogen via Gcc-help kirjoitti 12.2.2023 klo 19.51:
While cross compiling gcc with musl I see this:
checking for exported symbols...
/home/solskogen/gcc/libcc1/configure: line 15053: -T: command not found
yes
checking for -rdynamic... /home/solskogen/gcc/libcc1/configure: line
15063: -T: command not found
no
checking for library containing dlopen... none required
checking for -fPIC -shared... yes
configure: error:
Building GCC with plugin support requires a host that supports
-fPIC, -shared, -ldl and -rdynamic.
make[1]: *** [Makefile:11890: configure-libcc1] Error 1
This is the configure line: /home/solskogen/gcc/configure
--prefix=/usr --libexecdir=/lib --host=aarch64-centrix-linux-musl
--target=aarch64-centrix-linux-musl --build=x86_64-pc-linux-gnu
What is intersting in this case is WHICH GCC the build tries to use
when compiling libgcc. It should be the 'aarch64-centrix-linux-musl'
targeted cross-GCC, used for the becoming $host
system to create the executables and libraries for it. So what are
the CC_FOR_TARGET, GCC_FOR_TARGET, CXX_FOR_TARGET and GXX_FOR_TARGET
in the main Makefile and in the one
used for libgcc? My habit has been years to define these in
environment before running configure. Maybe these simply don't work
in the "native Canadian Cross" case. (To create a native
GCC with a cross-GCC).
I see this in configure:
Configuring in ./libcc1
configure: loading cache ./config.cache
checking build system type... x86_64-pc-linux-gnu
checking host system type... aarch64-centrix-linux-musl
checking target system type... aarch64-centrix-linux-musl
checking for aarch64-centrix-linux-musl-gcc...
aarch64-centrix-linux-musl-gcc
checking whether the C compiler works... yes
Which *should* mean that it finds the correct compiler. In the
Makefile I see this:
CC = aarch64-centrix-linux-musl-gcc
CXX = aarch64-centrix-linux-musl-g++
GCC_FOR_TARGET=$(STAGE_CC_WRAPPER) aarch64-centrix-linux-musl-gcc
CXX_FOR_TARGET=$(STAGE_CC_WRAPPER) aarch64-centrix-linux-musl-c++
CC_FOR_TARGET=$(STAGE_CC_WRAPPER) aarch64-centrix-linux-musl-gcc
All of the other tools also have the aarch64-centrix-linux-musl-
prefix as well, so as far as I understand this *should* work.
For curiousness I tried creating a native gcc for 'x86_64-linux-musl'
for which I had target headers and libs from year 2017.
I couldn't find equivalent for 'aarch64-linux-musl' in the net, only the
libraries in the "Void Linux" pages, but no development
headers.
I built first a cross-GCC from the gcc-12.2.0 sources with a gcc-5.5.0
as the build/host GCC, then tried to use the new cross-GCC
as the host/target compiler. But not defining the GCC_FOR_TARGET,
CXX_FOR_TARGET and CC_FOR_TARGET, letting the
configure to define them. In my case they of course were wrong because I
haven't only one GCC for a target at a time. As told,
I had already a toolchain - gcc-7.2.0 based - for 'x86_64-linux-musl' -
with exec-suffix '-7.2', so the new one got a suffix '-12'.
Ok, making symlinks with the bare 'x86_64-linux-musl-gcc' etc names to
point to the right ones solved this.
After this the only problem was trying to also use gcc-12.2.0 as the
$build GCC. It was too new and the 'gen*' stuff created for
the build $host was linked against the 12.2.0-version of the C++ library
but during runtime tried to use the older shared C++
library installed on the host system which didn't work. So back to
using the gcc-5.5.0 for the $build GCC...
The native-Canadian Cross succeeded then without any problems. One could
only wonder why "reinventing the wheel" would
be necessary when the earlier '$host-to-x86_64-linux-musl'
cross-compiler already had all the stuff being built for the $target
system. Aren't the separated 'lib/gcc/$target' and
'libexec/gcc/$target' stuff just for this purpose, to make it easy to
pack at least
the common header and library things?
The install command :
make DESTDIR=path-to-rootdir install
told in :
https://gcc.gnu.org/install/finalinstall.html
however should enable one to maintain a "temporary staging area or into
a |chroot| jail" on the $host system for each 'alien $host'.
So maybe "reinventing the wheel" via reproducing the already produced
$target stuff has some sanity...
I cannot say what the problem with the 'aarch64' architecture could be
but what I can see is that your GCC configure options are
quite simple when compared to what I "borrowed" from somewhere in 2017
in the 'x86_64' architecture case :
[root@AthlonXP2 ~]# x86_64-linux-musl-gcc -v
Using built-in specs.
COLLECT_GCC=x86_64-linux-musl-gcc
COLLECT_LTO_WRAPPER=/opt/cross/bin/../lib/gcc/x86_64-linux-musl/12.2.0/lto-wrapper
Target: x86_64-linux-musl
Configured with: ../configure --build=i686-linux-gnu
--host=i686-linux-gnu --target=x86_64-linux-musl --prefix=/opt/cross
--libdir=/opt/cross/lib --libexecdir=/opt/cross/lib
--with-sysroot=/opt/host-x86_64-linux-musl --enable-languages=c,c++
--enable-fast-character --disable-libsanitizer --disable-libvtv
--disable-libitm --disable-symvers libat_cv_have_ifunc=no
--enable-threads=posix --enable-__cxa_atexit --disable-multilib
--enable-shared --enable-lto --enable-vtable-verify
--enable-linker-build-id --enable-serial-configure --disable-werror
--disable-nls --enable-default-pie --enable-default-ssp
--enable-checking=release --disable-libstdcxx-pch
--with-linker-hash-style=gnu --disable-libunwind-exceptions
--disable-target-libiberty --with-default-libstdcxx-abi=gcc4-compatible
--with-gxx-include-dir=/opt/cross/include/c++/12.2
--program-prefix=x86_64-linux-musl- --program-suffix=-12
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 12.2.0 (GCC)