欢迎光临
我们一直在努力

Second toolchain

2.2.3 preparation
1) create new user vita
groupadd vita
useradd -m -s /bin/bash -g vita vita
2) add file vita to /etc/sudoers.d, file content is below:
vita ALL=(ALL) NOPASSWD: ALL

3) mkdir /vita

4) mkdir source build cross-tool cross-gcc-tmp sysroot

5) chown -R vita.vita /vita

6) add below content to /home/vita/.bashrc

unset LANG
export HOST=i686-pc-linux-gnu
export BUILD=$HOST
export TARGET=i686-none-linux-gnu
export CROSS_TOOL=/vita/cross-tool
export CROSS_GCC_TMP=/vita/cross-gcc-tmp
export SYSROOT=/vita/sysroot
PATH=$CROSS_TOOL/bin:$CROSS_GCC_TMP/bin:/sbin:/usr/sbin:$PATH

7) su – vita

2.2.4 install binutils

1) tar xvf ../source/binutils-2.23.1.tar.bz2

2) mkdir binutils-build

3) cd binutils-build

4) ../binutils-2.23.1/configure –prefix=$CROSS_TOOL –target=$TARGET –with-sysroot=$SYSROOT

5) make

6) make install

2.2.5 compile freestanding cross tool

1) cd /vita/build

2)  tar xvf ../source/gcc-4.7.2.tar.bz2
       cd gcc-4.7.2/
       tar xvf ../../source/gmp-5.0.5.tar.bz2
       mv gmp-5.0.5/ gmp
       tar xvf ../../source/mpc-1.0.1.tar.gz
       mv mpc-1.0.1/ mpc
       tar xvf ../../source/mpfr-3.1.1.tar.bz2
       mv mpfr-3.1.1/ mpfr

       cd /vita/build

       mkdir gcc-build

       cd gcc-build

       ../gcc-4.7.2/configure –prefix=$CROSS_GCC_TMP –target=$TARGET –with-sysroot=$SYSROOT –with-newlib –enable-languages=c –with-mpfr-include=/vita/build/gcc-4.7.2/mpfr/src –with-mpfr-lib=/vita/build/gcc-build/mpfr/src/.libs –disable-shared –disable-threads –disable-decimal-float –disable-libquadmath –disable-libmudflap –disable-libgomp –disable-nls –disable-libssp

             make

             make install

             cd /vita/cross-gcc-tmp

             ln -s libgcc.a lib/gcc/i686-none-linux-gnu/4.7.2/libgcc_eh.a

2.2.6 install kernel header file

cd /vita/build

tar xvf ../source/linux-3.7.4.tar.xz 

cd linux-3.7.4/

make mrproper

make ARCH=i386 headers_check

make ARCH=i386 INSTALL_HDR_PATH=$SYSROOT/usr/ headers_install

2.2.7 compile object system C library

apt-get install gawk

cd /vita/build

tar xvf ../source/glibc-2.15.tar.xz

cd glibc-2.15

patch -p1 < ../../source/glibc-2.15-cpuid.patch

patch -p1 < ../../source/glibc-2.15-s_frexp.patch

mkdir glibc-build

cd glibc-build

../glibc-2.15/configure –prefix=/usr –host=$TARGET –enable-kernel=3.7.4 –enable-add-ons –with-headers=$SYSROOT/usr/include libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_ctors_header=yes

make

make install_root=$SYSROOT install

2.2.8 setup whole cross compiler

cd /vita/build/gcc-build

rm -rf *

../gcc-4.7.2/configure –prefix=$CROSS_TOOL –target=$TARGET –with-sysroot=$SYSROOT –with-mpfr-include=/vita/build/gcc-4.7.2/mpfr/src –with-mpfr-lib=/vita/build/gcc-build/mpfr/src/.libs –enable-languages=c,c++ –enable-threads=posix

make

make install

2.2.9 set the environment variable

1)add below content to /home/vita/.bashrc

export CC="$TARGET-gcc" 

export CXX="$TARGET-g++" 

export AR="$TARGET-ar" 

export AS="$TARGET-as" 

export RANLIB="$TARGET-ranlib" 

export LD="$TARGET-ld" 

export STRIP="$TARGET-strip"

export DESTDIR=$SYSROOT

2) source /home/vita/.bashrc

2.2.10 encapsulate cross pkg-config

1)add below content to .bashrc

unset PKG_CONFIG_PATH  

export PKG_CONFIG_LIBDIR=$SYSROOT/usr/lib/pkgconfig:\  

    $SYSROOT/usr/share/pkgconfig 

2)add file /vita/cross-tool/bin/pkg-config

  1. #!/bin/bash  

  2. HOST_PKG_CFG=/usr/bin/pkg-config  

  3.  

  4. if [ ! $SYSROOT ]; then  

  5.     echo "Please make sure you are in cross-compile environment!"  

  6.     exit 1  

  7. fi  

  8.  

  9. $HOST_PKG_CFG –exists $*  

  10. if [ $? -ne 0 ]; then  

  11.     exit 1  

  12. fi  

  13.  

  14. if $HOST_PKG_CFG $* | sed -e "s/-I/-I\/vita\/sysroot/g;\  

  15. s/-L/-L\/vita\/sysroot/g"  

  16. then  

  17.     exit 0  

  18. else  

  19.     exit 1  

  20. fi 

3) chmod a+x /vita/cross-tool/bin/pkg-config

2.2.11 handle libtool

find $SYSROOT -name "*.la" -exec rm -f '{}' \;

2.2.12 start code

foo.c

#include <stdio.h>

void myinit(int argc, char **argv, char **envp)

{

        printf("%s\n",__FUNCTION__);

}

__attribute__((section(".init_array"))) typeof(myinit) *_myinit = myinit;

void test()

{

        printf("%s\n",__FUNCTION__);

}

bar.c

#include <stdio.h>

void main()

{

        printf("Enter main.\n");

        test();

}

#  gcc -shared -fPIC foo.c -o libfoo.so

#  gcc bar.c -o bar -L./ -lfoo

#  LD_LIBRARY_PATH=./ ./bar

myinit

Enter main.

test

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。