This is a guess, but when I build GCC cross compilers, I use sysroot equal to prefix. This creates a special configuration for binutils and GCC which may help you here.
Custom toolchain build fails
Question
I'm building an uClibc i486 cross toolchain for an embedded system. The toolchain is built on Debian Wheezy (x86-64) and consists of the following components:
- Binutils 2.24
- GCC 4.7.3
- Linux 3.2.54
- uClibc 0.9.33.2
- GMP 5.1.3
- MPFR 3.1.2
- MPC 1.0.2
These steps are used to build the toolchain:
Install Linux 3.2.54 headers
make mrproper
make \
ARCH=x86 \
INSTALL_HDR_PATH=/home/build-user/toolchain/i486-linux-uclibc \
headers_install
This step is successfully completed.
Build Binutils 2.24
Binutils is built in a separate directory as specified in the documentation.
./configure \
--prefix=/home/build-user/toolchain/ \
--target=i486-linux-uclibc
--with-sysroot=/home/build-user/toolchain/i486-linux-uclibc \
--with-lib-path=/home/build-user/toolchain/i486-linux-uclibc/lib \
--disable-nls \
--disable-multilib
make configure-host
make
make install
This step is successfully completed.
Build GMP 5.1.3
./configure \
--prefix=/home/build-user/toolchain/gmp \
--disable-shared \
--enable-static
make
make install
This step is successfully completed.
Build MPFR 3.1.2
./configure \
--prefix=/home/build-user/toolchain/mpfr \
--with-gmp=/home/build-user/toolchain/gmp \
--disable-shared \
--enable-static
make
make install
This step is successfully completed.
Build MPC 1.0.2
./configure \
--prefix=/home/build-user/toolchain/mpc \
--with-gmp=/home/build-user/toolchain/gmp \
--with-mpfr=/home/build-user/toolchain/mpfr \
--disable-shared \
--enable-static
make
make install
This step is successfully completed.
Build static GCC 4.7.3
GCC is built in a separate directory as specified in the documentation.
./configure \
--prefix=/home/build-user/toolchain \
--target=i486-linux-uclibc \
--with-arch=i486 \
--with-sysroot=/home/build-user/toolchain/i486-linux-uclibc \
--disable-multiarch \
--disable-nls \
--disable-shared \
--without-headers \
--with-newlib \
--disable-decimal-float \
--disable-libgomp \
--disable-libmudflap \
--disable-libssp \
--disable-libquadmath \
--disable-threads \
--enable-languages=c \
--disable-multilib \
--with-gmp=/home/build-user/toolchain/gmp \
--with-mpfr=/home/build-user/toolchain/mpfr \
--with-mpc=/home/build-user/toolchain/mpc
make all-gcc all-target-libgcc
make install-gcc install-target-libgcc
This step is successfully completed.
Build uClibc 0.9.33.2
The configuration file for uClibc is default with following options enabled:
TARGET_i386=y
CONFIG_486=y
UCLIBC_HAS_FENV=y
LINUXTHREADS_OLD=y
make \
ARCH=x86 \
DESTDIR=/home/build-user/toolchain/i486-linux-uclibc \
CROSS=i486-linux-uclibc- \
RUNTIME_PREFIX=/ \
DEVEL_PREFIX=/ \
KERNEL_HEADERS=/home/build-user/toolchain/i486-linux-uclibc/include \
install
This step is successfully completed.
Build final GCC 4.7.3
GCC is built in a separate directory as specified in the documentation.
./configure \
--prefix=/home/build-user/toolchain \
--target=i486-linux-uclibc \
--with-arch=i486 \
--with-sysroot=/home/build-user/toolchain/i486-linux-uclibc \
--with-native-system-header-dir=/include \
--disable-multiarch \
--disable-nls \
--enable-libssp \
--enable-c99 \
--disable-libgomp \
--enable-long-long \
--disable-libmudflap \
--enable-languages=c \
--disable-multilib \
--with-gmp=/home/build-user/toolchain/gmp \
--with-mpfr=/home/build-user/toolchain/mpfr \
--with-mpc=/home/build-user/toolchain/mpc
make
This step fails with the following errors:
/bin/bash /home/build-user/toolchain/packages/gcc-4.7.3/libgcc/../mkinstalldirs .
/home/build-user/toolchain/gcc-final-build/./gcc/xgcc -B/home/build-user/toolchain/gcc-final-build/./gcc/ -B/home/build-user/toolchain/i486-linux-uclibc/bin/ -B/home/build-user/toolchain/i486-linux-uclibc/lib/ -isystem /home/build-user/toolchain/i486-linux-uclibc/include -isystem /home/build-user/toolchain/i486-linux-uclibc/sys-include -O2 -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -isystem ./include -fpic -g -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector -shared -nodefaultlibs -Wl,--soname=libgcc_s.so.1 -Wl,--version-script=libgcc.map -o ./libgcc_s.so.1.tmp -g -O2 -B./ _muldi3_s.o _negdi2_s.o _lshrdi3_s.o _ashldi3_s.o _ashrdi3_s.o _cmpdi2_s.o _ucmpdi2_s.o _clear_cache_s.o _trampoline_s.o __main_s.o _absvsi2_s.o _absvdi2_s.o _addvsi3_s.o _addvdi3_s.o _subvsi3_s.o _subvdi3_s.o _mulvsi3_s.o _mulvdi3_s.o _negvsi2_s.o _negvdi2_s.o _ctors_s.o _ffssi2_s.o _ffsdi2_s.o _clz_s.o _clzsi2_s.o _clzdi2_s.o _ctzsi2_s.o _ctzdi2_s.o _popcount_tab_s.o _popcountsi2_s.o _popcountdi2_s.o _paritysi2_s.o _paritydi2_s.o _powisf2_s.o _powidf2_s.o _powixf2_s.o _powitf2_s.o _mulsc3_s.o _muldc3_s.o _mulxc3_s.o _multc3_s.o _divsc3_s.o _divdc3_s.o _divxc3_s.o _divtc3_s.o _bswapsi2_s.o _bswapdi2_s.o _clrsbsi2_s.o _clrsbdi2_s.o _fixunssfsi_s.o _fixunsdfsi_s.o _fixunsxfsi_s.o _fixsfdi_s.o _fixdfdi_s.o _fixxfdi_s.o _fixunssfdi_s.o _fixunsdfdi_s.o _fixunsxfdi_s.o _floatdisf_s.o _floatdidf_s.o _floatdixf_s.o _floatundisf_s.o _floatundidf_s.o _floatundixf_s.o _divdi3_s.o _moddi3_s.o _udivdi3_s.o _umoddi3_s.o _udiv_w_sdiv_s.o _udivmoddi4_s.o tf-signs_s.o addtf3_s.o divtf3_s.o eqtf2_s.o getf2_s.o letf2_s.o multf3_s.o negtf2_s.o subtf3_s.o unordtf2_s.o fixtfsi_s.o fixunstfsi_s.o floatsitf_s.o floatunsitf_s.o fixtfdi_s.o fixunstfdi_s.o floatditf_s.o floatunditf_s.o extendsftf2_s.o extenddftf2_s.o extendxftf2_s.o trunctfsf2_s.o trunctfdf2_s.o trunctfxf2_s.o enable-execute-stack_s.o unwind-dw2_s.o unwind-dw2-fde-dip_s.o unwind-sjlj_s.o unwind-c_s.o emutls_s.o libgcc.a -lc && rm -f ./libgcc_s.so && if [ -f ./libgcc_s.so.1 ]; then mv -f ./libgcc_s.so.1 ./libgcc_s.so.1.backup; else true; fi && mv ./libgcc_s.so.1.tmp ./libgcc_s.so.1 && ln -s libgcc_s.so.1 ./libgcc_s.so
/home/build-user/toolchain/i486-linux-uclibc/bin/ld: cannot find /lib/libc.so.0
/home/build-user/toolchain/i486-linux-uclibc/bin/ld: cannot find /lib/uclibc_nonshared.a
/home/build-user/toolchain/i486-linux-uclibc/bin/ld: cannot find /lib/ld-uClibc.so.0
collect2: error: ld returned 1 exit status
make[2]: *** [libgcc_s.so] Error 1
make[2]: Leaving directory `/home/build-user/toolchain/gcc-final-build/i486-linux-uclibc/libgcc'
make[1]: *** [all-target-libgcc] Error 2
make[1]: Leaving directory `/home/build-user/toolchain/gcc-final-build'
make: *** [all] Error 2
I check the linker search path:
/home/build-user/toolchain/i486-linux-uclibc/bin/ld --verbose | grep SEARCH_DIR
SEARCH_DIR("/home/build-user/toolchain/i486-linux-uclibc/lib");
The path is correct, so I search for the allegedly missing files in the directory:
find /home/build-user/toolchain/i486-linux-uclibc/lib \( -name libc.so.0 -o -name uclibc_nonshared.a -o -name ld-uClibc.so.0 \)
/home/build-user/toolchain/i486-linux-uclibc/lib/uclibc_nonshared.a
/home/build-user/toolchain/i486-linux-uclibc/lib/ld-uClibc.so.0
/home/build-user/toolchain/i486-linux-uclibc/lib/libc.so.0
All the files are found in the directory.
Can someone tell me what I'm doing wrong?
Solution
OTHER TIPS
I've had a similar problem lately.
I've used: uClibc-ng-1.0.29
, GCC-6.2.0
, Linux from Analog Devices (4.6.0
or something close to it) and binutils-2.27
. It was a cross-build for ARM. But I think it should also work in this case.
The problem is that when building uClibc
, libc.so
is not a real binary but a linker script that contains locations of libc.so.1
, uclibc_nonshared.a
and ld-uClibc.so.1
. When uClibc
is built the way you did, the linker script (libc.so
) provides locations of these libraries with respect to /
.
The solutions is to build uClibc
like this:
D=home/build-user/toolchain/i486-linux-uclibc;
make \
ARCH=x86 \
DESTDIR=/ \
CROSS=i486-linux-uclibc- \
RUNTIME_PREFIX=${D}/ \
DEVEL_PREFIX=${D}/usr/ \
KERNEL_HEADERS=/home/build-user/toolchain/i486-linux-uclibc/include \
install
The eventual installation location remains the same, but the entrances in libc.so
will contain now the correct paths to the missing/not-found libraries.
If you need for some reason RUNTIME_PREFIX
to be the same as DEVEL_PREFIX
then keep it. But uClibc
's .config
file suggests the way I proposed. Note that it may also affect building of GCC
.