[Clfs-support] Need help building the cross toolchain

George Boudreau georgeb at linuxfromscratch.org
Thu Nov 6 18:54:34 PST 2008


Jon Dufresne wrote:
> Hi,
> 
> I am attempting to build a cross toolchain in order to create a custom 
> embedded system. Through the advice of the book "Building Embedded Linux 
> Systems" I found the CLFS website and guide.
> 
> Now I am not using the CLFS guide verbatim, but I am taking _heavy_ 
> inspiration from it. That is, I'm mostly following it except where I 
> believe I don't need to. Apparently my assumptions are wrong as I can 
> not successfully build glibc. I have created a script that more or less 
> follows your guide, so that my results are reproducible. I will attach 
> the script inline to the bottom of this email so you can understand my 
> process and where I diverge from the guide.
> 
> I got all the packages from the urls in the script except glibc, which I 
> got from the clfs website at the following url: 
> http://cross-lfs.org/files/packages/svn/glibc-2.8.tar.bz2
> 
> When I run this script I get the following error during what looks like 
> the linking phase of glibc:
> 
> i686-pc-linux-gnu-gcc   -nostdlib -nostartfiles -r -o 
> /home/jdufresne/devel/trunk/crosstools/build/glibc-build/elf/librtld.map.o 
> '-Wl,-(' 
> /home/jdufresne/devel/trunk/crosstools/build/glibc-build/elf/dl-allobjs.os 
> /home/jdufresne/devel/trunk/crosstools/build/glibc-build/libc_pic.a 
> -lgcc '-Wl,-)' 
> -Wl,-Map,/home/jdufresne/devel/trunk/crosstools/build/glibc-build/elf/librtld.mapT
> /home/jdufresne/devel/trunk/crosstools/toolchain/lib/gcc/i686-pc-linux-gnu/4.3.2/../../../../i686-pc-linux-gnu/bin/ld: 
> cannot find -lgcc
> collect2: ld returned 1 exit status
> 
> The key error being: cannot find -lgcc
> 
> I have done extensive googling on this error and have not found much.
> 
> Now, if I look look for libgcc.a I do _not_ find it. So it appears that 
> ld is telling the truth. If I look for libgcc.a this is all I see:
> 
> $ find . -name \*gcc\*
> ./toolchain/man/man1/i686-pc-linux-gnu-gcc.1
> ./toolchain/lib/gcc
> ./toolchain/bin/i686-pc-linux-gnu-gccbug
> ./toolchain/bin/i686-pc-linux-gnu-gcc-4.3.2
> ./toolchain/bin/i686-pc-linux-gnu-gcc
> ./toolchain/libexec/gcc
> ./toolchain/i686-pc-linux-gnu/bin/gcc
> ./toolchain/info/gcc.info <http://gcc.info>
> ./toolchain/info/gccinstall.info <http://gccinstall.info>
> ./toolchain/info/gccint.info <http://gccint.info>
> ./build/gcc-4.3.2.tar.bz2
> ./build/gcc-static-build
> ./build/gcc-static-build/gcc
> ./build/gcc-static-build/gcc/gcc-options.o
> ./build/gcc-static-build/gcc/gcc.o
> ./build/gcc-static-build/gcc/xgcc
> ./build/gcc-static-build/gcc/gcc-vers.texi
> ./build/gcc-static-build/gcc/libgcc.mvars
> ./build/gcc-static-build/gcc/gccspec.o
> ./build/gcc-static-build/gcc/gccbug
> ./build/gcc-static-build/gcc/gcc-cross
> ./build/gcc-static-build/gcc/doc/gcc.info <http://gcc.info>
> ./build/gcc-static-build/gcc/doc/gccinstall.info <http://gccinstall.info>
> ./build/gcc-static-build/gcc/doc/gccint.info <http://gccint.info>
> ./build/glibc-2.8/sysdeps/s390/gccframe.h
> ./build/glibc-2.8/sysdeps/sparc/gccframe.h
> ./build/glibc-2.8/sysdeps/powerpc/gccframe.h
> ./build/glibc-2.8/sysdeps/powerpc/powerpc32/libgcc-compat.S
> ./build/glibc-2.8/sysdeps/ia64/gccframe.h
> ./build/glibc-2.8/sysdeps/ia64/ia64libgcc.S
> ./build/glibc-2.8/sysdeps/i386/gccframe.h
> ./build/glibc-2.8/sysdeps/generic/gccframe.h
> ./build/glibc-2.8/sysdeps/alpha/gccframe.h
> ./build/glibc-2.8/sysdeps/sh/gccframe.h
> ./build/glibc-2.8/gnulib/tst-gcc.c
> 
> 
> My question is, why is the build_gcc_static stage of my script not 
> building and installing libgcc.a? Where should this end up after 
> compilation? Do I need a new configure flag on gcc?
> 
> Thanks for any help,
> Jon
> 

   I tried running your script to see your error but it failed during 
the  gcc-static config stage (missing gmp and mpfr)

   As for your stated problem: gcc-4.3.x has an odd issue with make 
all-gcc.  Instead use:

make
make install


   Also, gcc-4.3.x requires gmp and mpfr. You can use the method from 
CLFS or the inline method from DIY-Linux.

   regards
       George.

> -----
> #!/bin/bash
> 
> unset CFLAGS
> unset CXXFLAGS
> 
> KERNEL_ARCH=i386
> HOST=i686-cross-linux-gnu
> TARGET=i686-pc-linux-gnu
> 
> ROOTFS=`pwd`/rootfs
> BUILD=`pwd`/build
> PREFIX=`pwd`/toolchain
> 
> # latest
> KERNEL_VERSION=2.6.27.4 <http://2.6.27.4>
> BINUTILS_VERSION=2.19
> GCC_VERSION=4.3.2
> #GLIBC_VERSION=2.8-20081103
> GLIBC_VERSION=2.8
> 
> PATH=${PREFIX}/bin:${PATH}
> export PATH
> 
> mkdirs()
> {
>    if [ ! -d ${BUILD} ]; then
>        echo "creating ${BUILD}"
>        mkdir -pv ${BUILD}
>    fi
> 
> rm -rf \
> ${BUILD}/linux-${KERNEL_VERSION} \
> ${BUILD}/binutils-${BINUTILS_VERSION} \
> ${BUILD}/binutils-build \
> ${BUILD}/gcc-${GCC_VERSION} \
> ${BUILD}/gcc-static-build \
> ${BUILD}/gcc-build \
> ${BUILD}/glibc-${GLIBC_VERSION} \
> ${BUILD}/glibc-headers-build \
> ${BUILD}/glibc-build \
> ${PREFIX} \
> ${ROOTFS}
> }
> 
> download_packages()
> {
>    if [ ! -f linux-${KERNEL_VERSION}.tar.bz2 ]; then
> wget http://kernel.org/pub/linux/kernel/v2.6/linux-${KERNEL_VERSION}.tar.bz2
>    fi
> 
> if [ ! -f binutils-${BINUTILS_VERSION}.tar.bz2 ]; then
>        wget 
> http://ftp.gnu.org/gnu/binutils/binutils-${BINUTILS_VERSION}.tar.bz2
>    fi
> 
> if [ ! -f gcc-${GCC_VERSION}.tar.bz2 ]; then
>        wget 
> http://gcc-ca.internet.bs/releases/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.bz2
>    fi
> 
> if [ ! -f glibc-${GLIBC_VERSION}.tar.bz2 ]; then
>        wget http://ftp.gnu.org/gnu/glibc/glibc-${GLIBC_VERSION}.tar.bz2
>    fi
> }
> 
> build_kernel_headers()
> {
>    echo "Building linux-${KERNEL_VERSION} headers ARCH=${KERNEL_ARCH}"
> 
>    tar xvjf linux-${KERNEL_VERSION}.tar.bz2
>    cd linux-${KERNEL_VERSION}
> 
>    make ARCH=${KERNEL_ARCH} headers_check || exit
>    make ARCH=${KERNEL_ARCH} INSTALL_HDR_PATH=${ROOTFS}/usr 
> headers_install || exit
> 
>    cd ..
>    rm -rf linux-${KERNEL_VERSION}
> }
> 
> build_binutils()
> {
>    echo "Building binutils-${BINUTILS_VERSION} HOST=${HOST} 
> TARGET=${TARGET}"
> 
>    tar xjvf binutils-${BINUTILS_VERSION}.tar.bz2
> 
>    mkdir -v binutils-build
>    cd binutils-build
> 
>    ../binutils-${BINUTILS_VERSION}/configure \
>        --prefix=${PREFIX} \
>        --build=${HOST} \
>        --host=${HOST} \
>        --target=${TARGET} \
>        --with-sysroot=${ROOTFS} \
>        --disable-nls \
>        --enable-shared \
>        --disable-multilib \
>        || exit
> 
> make configure-host || exit
>    make || exit
>    make install || exit
> 
>    cd ..
>    rm -rf binutils-build binutils-${BINUTILS_VERSION}
> }
> 
> build_gcc_static()
> {
>    echo "Building gcc-${GCC_VERSION} stage1 TARGET=${PREFIX}"
> 
>    tar xjvf gcc-${GCC_VERSION}.tar.bz2
> 
>    mkdir -v gcc-static-build
>    cd gcc-static-build
> 
>    ../gcc-${GCC_VERSION}/configure \
>        --prefix=${PREFIX} \
>        --build=${HOST} \
>        --host=${HOST} \
>        --target=${TARGET} \
>        --with-sysroot=${ROOTFS} \
>        --disable-multilib \
>        --disable-nls \
>        --disable-shared \
>        --disable-libgomp \
>        --disable-libmudflap \
>        --disable-libssp \
>        --enable-languages=c \
>        || exit
> 
>    make all-gcc || exit
>    make install-gcc || exit
> 
>    cd ..
>    #rm -rf gcc-static-build gcc-${GCC_VERSION}
>    rm -rf gcc-${GCC_VERSION}
> }
> 
> build_glibc()
> {
> echo "Building glibc-${GLIBC_VERSION}"
> 
>    tar xjvf glibc-${GLIBC_VERSION}.tar.bz2
> 
>    mkdir -v glibc-build
>    cd glibc-build
> 
> echo "libc_cv_forced_unwind=yes" > config.cache
> echo "libc_cv_c_cleanup=yes" >> config.cache
> 
>    BUILD_CC=gcc \
>    CC=${TARGET}-gcc \
>    AR=${TARGET}-ar \
>    RANLIB=${TARGET}-ranlib \
>    ../glibc-${GLIBC_VERSION}/configure \
>        --prefix=/usr \
>        --build=${HOST} \
>        --host=${TARGET} \
>        --disable-profile \
>        --enable-add-ons \
>        --with-tls \
>        --enable-kernel=2.6.0 \
>        --with-__thread \
>        --with-binutils=${PREFIX}/bin \
>        --with-headers=${ROOTFS}/usr/include \
>        --cache-file=config.cache \
>        || exit
> 
>    make || exit
>    make install_root=${ROOTFS} install || exit
> 
>    cd ..
>    rm -rf glibc-build glibc-${GLIBC_VERSION}
> }
> 
> build_gcc()
> {
>    echo "Building gcc-${GCC_VERSION} final TARGET=${PREFIX}"
> 
>    tar xjvf gcc-${GCC_VERSION}.tar.bz2
> 
>    mkdir -v gcc-build
>    cd gcc-build
> 
>    ../gcc-${GCC_VERSION}/configure \
>        --prefix=${PREFIX} \
>        --build=${HOST} \
>        --host=${HOST} \
>        --target=${TARGET} \
>        --with-sysroot=${ROOTFS} \
>        --disable-multilib \
>        --disable-nls \
>        --enable-shared \
>        --enable-threads=posix \
>        --enable-languages=c,c++ \
>        --enable-__cxa_atexit \
>        --enable-c99 \
>        --enable-long-long \
>        || exit
> 
>    make || exit
>    make install || exit
> 
> 
>    cd ..
>    #rm -rf gcc-build gcc-${GCC_VERSION}
>    rm -rf gcc-${GCC_VERSION}
> }
> 
> mkdirs
> cd $BUILD
> download_packages
> 
> build_kernel_headers
> build_binutils
> build_gcc_static
> build_glibc
> build_gcc
> 
> cd ..
> 
> ----
> 
> $ toolchain/bin/i686-pc-linux-gnu-gcc -dumpspecs
> *asm:
> %{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*}
> 
> *asm_debug:
> %{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} 
> %{fdebug-prefix-map=*:--debug-prefix-map %*}
> 
> *asm_final:
> 
> 
> *asm_options:
> %{--target-help:%:print-asm-header()} %a %Y %{c:%W{o*}%{!o*:-o 
> %w%b%O}}%{!c:-o %d%w%u%O}
> 
> *invoke_as:
> %{!S:-o %|.s |
>  as %(asm_options) %|.s %A }
> 
> *cpp:
> %{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}
> 
> *cpp_options:
> %(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} 
> %{w} %{f*} %{g*:%{!g0:%{!fno-working-directory:-fworking-directory}}} 
> %{O*} %{undef} %{save-temps:-fpch-preprocess}
> 
> *cpp_debug_options:
> %{d*}
> 
> *cpp_unique_options:
> %{C|CC:%{!E:%eGCC does not support -C or -CC without -E}} %{!Q:-quiet} 
> %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I %{MD:-MD 
> %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} 
> %{MF*} %{MG} %{MP} %{MQ*} %{MT*} 
> %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}} %{remap} 
> %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD} %{H} %C %{D*&U*&A*} %{i*} 
> %Z %i %{fmudflap:-D_MUDFLAP -include mf-runtime.h} 
> %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h} %{E|M|MM:%W{o*}}
> 
> *trad_capable_cpp:
> cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}
> 
> *cc1:
> %(cc1_cpu) %{profile:-p}
> 
> *cc1_options:
> %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are 
> incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} 
> %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} 
> %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs} %{v:-version} 
> %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} 
> %{--target-help:--target-help} %{--help=*:--help=%(VALUE)} 
> %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} 
> %{-param*} %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants} 
> %{coverage:-fprofile-arcs -ftest-coverage}
> 
> *cc1plus:
> 
> 
> *link_gcc_c_sequence:
> %{static:--start-group} %G %L %{static:--end-group}%{!static:%G}
> 
> *link_ssp:
> %{fstack-protector|fstack-protector-all:-lssp_nonshared -lssp}
> 
> *endfile:
> %{ffast-math|funsafe-math-optimizations:crtfastmath.o%s}    
> %{mpc32:crtprec32.o%s}    %{mpc64:crtprec64.o%s}    
> %{mpc80:crtprec80.o%s}    %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s
> 
> *link:
> %{!static:--eh-frame-hdr} -m %(link_emulation) %{shared:-shared}   
> %{!shared:     %{!ibcs:       %{!static:     %{rdynamic:-export-dynamic} 
>     %{!dynamic-linker:-dynamic-linker %(dynamic_linker)}}     
> %{static:-static}}}
> 
> *lib:
> %{pthread:-lpthread}    %{shared:-lc}    %{!shared:%{mieee-fp:-lieee} 
> %{profile:-lc_p}%{!profile:-lc}}
> 
> *mfwrap:
>  %{static: %{fmudflap|fmudflapth:  --wrap=malloc --wrap=free 
> --wrap=calloc --wrap=realloc --wrap=mmap --wrap=munmap --wrap=alloca} 
> %{fmudflapth: --wrap=pthread_create}} %{fmudflap|fmudflapth: --wrap=main}
> 
> *mflib:
> %{fmudflap|fmudflapth: -export-dynamic}
> 
> *link_gomp:
> 
> 
> *libgcc:
> -lgcc
> 
> *startfile:
> %{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}}    
> crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}
> 
> *switches_need_spaces:
> 
> 
> *cross_compile:
> 1
> 
> *version:
> 4.3.2
> 
> *multilib:
> . ;
> 
> *multilib_defaults:
> 
> 
> *multilib_extra:
> 
> 
> *multilib_matches:
> 
> 
> *multilib_exclusions:
> 
> 
> *multilib_options:
> 
> 
> *linker:
> collect2
> 
> *link_libgcc:
> %D
> 
> *md_exec_prefix:
> 
> 
> *md_startfile_prefix:
> 
> 
> *md_startfile_prefix_1:
> 
> 
> *startfile_prefix_spec:
> 
> 
> *sysroot_spec:
> --sysroot=%R
> 
> *sysroot_suffix_spec:
> 
> 
> *sysroot_hdrs_suffix_spec:
> 
> 
> *cc1_cpu:
> %{mcpu=*:-mtune=%* %n`-mcpu=' is deprecated. Use `-mtune=' or '-march=' 
> instead.
> } %<mcpu=* %{mintel-syntax:-masm=intel %n`-mintel-syntax' is deprecated. 
> Use `-masm=intel' instead.
> } %{mno-intel-syntax:-masm=att %n`-mno-intel-syntax' is deprecated. Use 
> `-masm=att' instead.
> }%{march=native:%<march=native %:local_cpu_detect(arch)   
> %{!mtune=*:%<mtune=native %:local_cpu_detect(tune)}} 
> %{mtune=native:%<mtune=native %:local_cpu_detect(tune)}
> 
> *link_emulation:
> elf_i386
> 
> *dynamic_linker:
> %{muclibc:%{mglibc:%e-mglibc and -muclibc used 
> together}/lib/ld-uClibc.so.0;:/lib/ld-linux.so.2}
> 
> *link_command:
> %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:    %(linker) %l %{pie:-pie} 
> %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r}    %{s} %{t} %{u*} %{x} 
> %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}    %{static:} %{L*} 
> %(mfwrap) %(link_libgcc) %o    
> %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)} 
> %(mflib)    %{fprofile-arcs|fprofile-generate|coverage:-lgcov}    
> %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}    
> %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}
> 
> ----
> 
> $ toolchain/bin/i686-pc-linux-gnu-gcc -print-libgcc-file-name
> libgcc.a
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Clfs-support mailing list
> Clfs-support at lists.cross-lfs.org
> http://lists.cross-lfs.org/listinfo.cgi/clfs-support-cross-lfs.org




More information about the Clfs-support mailing list