免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1524 | 回复: 0
打印 上一主题 下一主题

交叉编译(draft) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-16 16:48 |只看该作者 |倒序浏览

                               
一、准备工作
$ sudo apt-get install build-essential
$ sudo apt-get install automake
$ sudo apt-get install bison flex
$ sudo apt-get install texinfo
$ sudo apt-get install gwak
二、下载源码包
源码包                                               下载地址/方法
binutils-2.19.tar.gz                      ftp.gnu.org/gnu/binutils
gcc-core-4.3.3.tar.gz                     ftp.gnu.org/gnu/gcc
gcc-g++-4.3.3.tar.gz                      ftp.gnu.org/gnu/gcc
mpfr-2.4.1.tar.gz                         http://ftp.osuosl.org/pub/clfs/conglomeration/glibc/
gmp-4.3.0.tar.gz                          http://ftp.osuosl.org/pub/clfs/conglomeration/glibc/
linux-2.6.28.tar.gz(linux-2.6.24)          ftp.kernel.org/pub/linux/kernel
glibc-ports-2.7.tar.gz                    ftp.gnu.org/gnu/glibc
glibc-2.7.tar.gz                          ftp.gnu.org/gnu/glibc
另外还需要glibc-2.7的补丁(http://ftp.osuosl.org/pub/clfs/conglomeration/glibc/)
glibc-2.7-alpha_ioperm_fix-1.patch
glibc-2.7-alpha_PTR_MANGLE_fix-1.patch
glibc-2.7-branch_update-1.patch
glibc-2.7-branch_update-1A.patch
glibc-2.7-libgcc_eh-1.patch
glibc-2.7-localedef_segfault-1.patch
三 工作环境
export proot=~/embedded
export prefix=~/embedded/cross-tools
export target=arm-linux
export PATH=$prefix/bin:$PATH
创建tars目录,把上面下载的源码包和补丁都放在~/tars目录下,之后创建src用来存放以后解压缩的源码包,build作为我们编译的地方:
$ mkdir ~/tars
$ mkdir ~/tars/src
$ mkdir ~/tars/build
四 编译binutils
$ cd ~/tars/src
$ tar -zvxf ../binutils-2.19.tar.gz
$ cd ~/tars/build
$ mkdir binutils
$ cd binutils
$ ../../src/binutils-2.19/configure --target=$target --prefix=$prefix
/* ../../src/binutils-2.19/configure --target=$target --prefix=$prefix --with-sysroot=$prefix */
$ make
$ make all install
注:在make这一步中,可能会在编译SourceDir/binutils-2.19/gas/config/tc-arm.c出现gcc把警告当成错误的错误,其原因在于编译该文件时使用了-Werror选项,解决办法是修改SourceDir/binutils-2.19/gas/configure文件第10624行,把ERROR_ON_WARNING=yes改为ERROR_ON_WARNING=no,保存退出,重新执行make即可。注意configure有个参数 with-sysroot,指定交叉工具链的工作目录。交叉工具链在编译时查找头文件以及在链接时查找动态或静态库到--with-sysroot指定的路径,可以考虑使用。
生成中会有arm-linux 目录,存放的确是i386的binutils程序
五 编译gcc(第一遍)
第一次编译gcc只是为了产生针对target用的编译工具,因此不需要头文件和特别注意的,当然要注意满足target的要求。
$ cd ~/tars/src
$ tar -zvxf ../gcc-core-4.3.3.tar.gz
从 GCC-4.3起,安装GCC将依赖于GMP-4.1以上版本和MPFR-2.3.2以上版本。如果将这两个软件包分别解压到GCC源码树的根目录下,并分别命名为"gmp"和"mpfr",那么GCC的编译程序将自动将两者与GCC一起编译。建议尽可能使用最新的GMP和MPFR版本。
$ tar -zvxf ../mpfr-2.4.1.tar.gz
$ tar -zvxf ../gmp-4.3.0.tar.gz
$ mv mpfr-2.4.1 gcc-4.3.3/mpfr
$ mv gmp-4.3.0 gcc-4.3.3/gmp
由于第一次安装ARM交叉编译工具,那么支持的libc库的头文件也没有!所以我们征用Dinhibit_libc来解决这个问题。操作如下:
$ cd gcc-4.3.3/gcc/config/arm
$ mv t-linux t-linux-orig
$ sed 's/TARGET_LIBGCC2_CFLAGS =/TARGET_LIBGCC2_CFLAGS = -D__gthr_posix_h -Dinhibit_libc/'  t-linux-core
$ cp t-linux-core t-linux
编译
$ cd ~/tars/build
$ mkdir gcc-core
$ cd gcc-core
$ ../../src/gcc-4.3.3/configure \
--target=$target \
--prefix=$prefix \
--enable-languages=c \
--disable-shared \
--disable-threads \
--disable-libmudflap \
--disable-libssp \
--with-sysroot=$prefix
/*--with-sysroot=$prefix*/
/* --without-headers? */
注:由于没有arm的glibc,需要使用--disable-libmudflap --disable-libssp,禁止两个边界检查使用的库。
$ make all-gcc (如果有错则忽略之,注意是all-gcc,不是all)
$ make install-gcc
$ make all-target-libgcc(this step and next should do, or the following glibc compiling will fail because scare of gcc .a library)
$ make install-target-libgcc
六、创建 linux-kernel 头文件
$ cd ~/tars/src
$ tar -zvxf ../linux-2.6.24.tar.gz
$ cd linux-2.6.24
$ ARCH=arm CROSS_COMPILE=arm-linux- make distclean (clean)
$ ARCH=arm CROSS_COMPILE=arm-linux- make zylonitep_defconfig (load default config file)
$ make include/linux/version.h
$ mkdir $prefix/$target/include
$ cp -a include/linux    $prefix/$target/include/linux
$ cp -a include/asm-arm   $prefix/$target/include/asm
$ cp -a include/asm-generic   $prefix/$target/include/asm-generic
/** change to /usr/include **/
七、编译glibc
$ cd ~/tars/src
$ tar -zvxf ../glibc-2.7.tar.gz
$ tar -zvxf ../glibc-ports-2.7.tar.gz
$ mv -v glibc-ports-2.7 glibc-2.7/ports
$ cd glibc-2.7
$ patch -Np1 -i ../../glibc-2.7-alpha_ioperm_fix-1.patch
$ patch -Np1 -i ../../glibc-2.7-alpha_PTR_MANGLE_fix-1.patch
$ patch -Np1 -i ../../glibc-2.7-branch_update-1.patch
$ patch -Np1 -i ../../glibc-2.7-branch_update-1A.patch
$ patch -Np1 -i ../../glibc-2.7-libgcc_eh-1.patch
$ patch -Np1 -i ../../glibc-2.7-localedef_segfault-1.patch
从gcc4.3开始将一部分头文件放到另一个文件夹中,导致glibc找不到,对glibc的configure做补丁(至于原因可以参见configure文件里的注释):
$ sed -i -e "/ccheaders=/s@\`\(\$CC.*include\)\`@\"& -isystem \`\1-fixed\`\"@" configure
为了编译通过修改的文件
$ sed -i 's/# define UNDOCARGS_5\tUNDOCARGS_4/&\n\n# define DOCARGS_6\tDOCARGS_5\n# define UNDOCARGS_6\tUNDOCARGS_5/' ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h
在文件ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h,增加这一句 #include
编译:
$ cd ~/tars/build
$ mkdir glibc
$ cd glibc
$ CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib \
../../src/glibc-2.7/configure \
--host=arm-linux \
--prefix=$prefix/$target \
--enable-add-ons \
--with-headers=$prefix/$target/include \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes
$ make
$ make install
八、编译gcc(第二遍)
恢复先前的t-linux文件:
$ cd ~/tars/src
$ cd gcc-4.3.3/gcc/config/arm
$ mv t-linux t-linux.bak
$ mv t-linux-orig t-liinux
解压缩 c++ 编译器源码包:
$ cd ~/tars/src
$ tar -zvxf ../gcc-g++-4.3.3.tar.gz
编译c、c++编译器:
$ cd ~/tars/BuildDir/gcc-core
$ make clean
$ make distclean
$ ../../src/gcc-4.3.3/configure \
--target=$target \
--prefix=$prefix \
--enable-languages=c \
--enable-threads=posix \
--enable-shared \
--enable-__cxa_atexit \
--with-local-prefix=$prefix
$ make all
$ make install
编译内核&内核模块
$ ARCH=arm CROSS_COMPILE=arm-linux- make
This step install the kernel module(if neccessary)
$ make ARCH=arm CROSS_COMPILE=arm-linux- \
    INSTALL_MOD_PATH=${rootfs}/lib/module modules_install
make ARCH=arm CROSS_COMPILE=arm-linux- modules
生成根文件系统
1 busybox
export rootfs=~/embedded/rootfs
$ make ARCH=arm CROSS_COMPILE=arm-linux- \
CONFIG_PREFIX=${rootfs} install
2 glibc library  
cp lib*-*.so ${rootfs}/libtmp
cp -d lib*.so.[*0-9] ${rootfs}/libtmp
cp -d ld*.so* ${rootfs}/libtmp
cp libSegFault.so libmemusage.so libpcprofile.so \
${rootfs}/libtmp
3 sys init
/etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:/sbin/getty -L /dev/console 115200,38400 xterm
::shutdown:/etc/init.d/rc.shutdown
::ctrlaltdel:/sbin/reboot
::restart:/sbin/init
rcS
#!/bin/sh
# Remount the root filesystem in read-write (requires /etc/fstab)
mount -n -o remount,rw /
# Start the network interface
/sbin/ifconfig eth0 192.168.1.101
fstab
proc         /proc     proc     defaults    0 0
tmpfs        /dev    tmpfs    defaults    0 0
devpts        /dev/pts devpts    defaults    0 0
sysfs        /sys    sysfs    defaults    0 0
tmpfs         /tmp     tmpfs     defaults    0 0
tmpfs         /dev/shm tmpfs     defaults,rw    0 0
/dev/ubdc    /var     auto    defaults    0 0
4 dev file
sudo mknod -m 600 mem c 1 1
sudo mknod -m 666 null c 1 3
sudo mknod -m 666 zero c 1 5
sudo mknod -m 644 random c 1 8
sudo mknod -m 666 tty0 c 4 0
sudo mknod -m 666 tty1 c 4 1
sudo mknod -m 644 ttyS0 c 4 64
sudo mknod -m 666 tty c 5 0
sudo mknod -m 644 console c 5 1
nandwrite -z 0x80008000 0x240000 0x200000
nandwrite -z 0x80008000 0x240000 0x700000
nandwrite -j 0x80008000 0x240000 0x300000
nandwrite -z 0x80008000 0x40000 0x200000
nwritecmdline root=/dev/mtdblock2 rootfstype=cramfs mtdparts=mhn-nand:256k(Bootloader),2M@256k(Kernel),64M@0x240000(rootfs),42M@0x4240000(var) console=ttyS0,115200 mem=128M ip=192.168.1.101:192.168.1.100::255.255.255.0::eth1 off video=pxafb:nocursor
nwritecmdline root=/dev/mtdblock2  init=/sbin/init rootfstype=cramfs ip=192.168.1.101:192.168.1.100::255.255.255.0::eth1:off mtdparts=mhn-nand:256k(Bootloader),2M@256k(Kernel),7M@0x240000(rootfs),42M@0x4240000(var) console=ttyS0,115200 mem=64M video=pxafb:nocursor
sudo apt-get install libncurses5-dev
  arm-linux-readelf -a ~/embedded/rootfs/bin/busybox | grep "Shared library"
nanderase -j 0x2c40000 0x1100000
nwritecmdline root=/dev/mtdblock2 rootfstype=cramfs ip=192.168.1.101:192.168.1.100::255.255.255.0::eth0:on mtdparts=mhn-nand:256k(Bootloader),2M@256k(Kernel),42M@0x240000(rootfs),17M@0x2c40000(var) console=ttyS0,115200 mem=64M video=pxafb:nocursor
make mrproper
make ARCH=arm headers_check
make ARCH=arm INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* ${prefix}/include
find ${prefix}/usr/include -name .install -or -name ..install.cmd | xargs rm -fv
patch -Np1 -i ../../patch/glibc-2.7-alpha_ioperm_fix-1.patch
patch -Np1 -i ../../patch/glibc-2.7-alpha_PTR_MANGLE_fix-1.patch
patch -Np1 -i ../../patch/glibc-2.7-branch_update-1.patch
patch -Np1 -i ../../patch/glibc-2.7-branch_update-1A.patch
patch -Np1 -i ../../patch/glibc-2.7-libgcc_eh-1.patch
patch -Np1 -i ../../patch/glibc-2.7-localedef_segfault-1.patch
CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib \
../../src/glibc-2.7/configure \
--host=arm-linux \
--prefix=$prefix/$target \
--enable-add-ons \
--with-headers=$prefix/usr/include \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes
make install-headers install_root=${SYSROOT} //安装 glibc头文件
2.7没有这个文件 ,也touch一个。
cp -v bits/stdio_lim.h ${SYSROOT}/usr/include/bits //复制编译后续编译所要的头文件
touch ${SYSROOT}/usr/include/gnu/stubs.h
cd ~/tars/src
cd gcc-4.3.3/gcc/config/arm
mv t-linux t-linux.bak
mv t-linux-orig t-linux
http://hi.baidu.com/benzus/blog/item/2f4b849b31382dbdc9eaf4ef.html
http://blog.chinaunix.net/u2/62168/showart_1898826.html
http://cross-lfs.org/view/clfs-sysroot/arm/cross-tools/eglibc.html
======================
一、准备工作
$ sudo apt-get install build-essential
$ sudo apt-get install automake
$ sudo apt-get install bison flex
$ sudo apt-get install texinfo
$ sudo apt-get install gwak
二、下载源码包
源码包                                               下载地址/方法
binutils-2.19.tar.gz                      ftp.gnu.org/gnu/binutils
gcc-core-4.3.3.tar.gz                     ftp.gnu.org/gnu/gcc
gcc-g++-4.3.3.tar.gz                      ftp.gnu.org/gnu/gcc
mpfr-2.4.1.tar.gz                         http://ftp.osuosl.org/pub/clfs/conglomeration/glibc/
gmp-4.3.0.tar.gz                          http://ftp.osuosl.org/pub/clfs/conglomeration/glibc/
linux-2.6.28.tar.gz(linux-2.6.24)          ftp.kernel.org/pub/linux/kernel
glibc-ports-2.7.tar.gz                    ftp.gnu.org/gnu/glibc
glibc-2.7.tar.gz                          ftp.gnu.org/gnu/glibc
另外还需要glibc-2.7的补丁(http://ftp.osuosl.org/pub/clfs/conglomeration/glibc/)
glibc-2.7-alpha_ioperm_fix-1.patch
glibc-2.7-alpha_PTR_MANGLE_fix-1.patch
glibc-2.7-branch_update-1.patch
glibc-2.7-branch_update-1A.patch
glibc-2.7-libgcc_eh-1.patch
glibc-2.7-localedef_segfault-1.patch
三 工作环境
export proot=~/embedded
export prefix=~/embedded/cross-tools
export target=arm-linux
export PATH=$prefix/bin:$PATH
创建tars目录,把上面下载的源码包和补丁都放在~/tars目录下,之后创建src用来存放以后解压缩的源码包,build作为我们编译的地方:
$ mkdir ~/tar
$ mkdir ~/tar/src
$ mkdir ~/tar/build
四 编译binutils
$ cd ~/tar/src
$ tar -zvxf ../binutils-2.19.tar.gz
$ cd ~/tar/build
$ mkdir binutils
$ cd binutils
../../src/binutils-2.19/configure --target=$target --prefix=$prefix --with-sysroot=$prefix  --disable-nls --enable-shared --disable-multilib
$ make
$ make all install
注:在make这一步中,可能会在编译SourceDir/binutils-2.19/gas/config/tc-arm.c出现gcc把警告当成错误的错误,其原因在于编译该文件时使用了-Werror选项,解决办法是修改SourceDir/binutils-2.19/gas/configure文件第10624行,把ERROR_ON_WARNING=yes改为ERROR_ON_WARNING=no,保存退出,重新执行make即可。注意 configure有个参数 with-sysroot,指定交叉工具链的工作目录。交叉工具链在编译时查找头文件以及在链接时查找动态或静态库到--with-sysroot指定的路径,可以考虑使用。
生成中会有arm-linux 目录,存放的确是i386的binutils程序
install the linux kernel headers
$ cd ~/tar/src
$ tar -zvxf ../linux-2.6.24.tar.gz
$ cd linux-2.6.24
$ ARCH=arm CROSS_COMPILE=arm-linux- make distclean (clean)
$ ARCH=arm CROSS_COMPILE=arm-linux- make zylonite_defconfig (load default config file)
$ make include/linux/version.h
$ mkdir $prefix/$target/include
cp -a include/linux    $prefix/usr/include/linux
cp -a include/asm-arm   $prefix/usr/include/asm
cp -a include/asm-generic   $prefix/usr/include/asm-generic
cp -a arch/arm/include/asm   $prefix/usr/include
cp -a arch/arm/mach-pxa/include/mach   $prefix/usr/include/asm
think using kernel install cmd.
install the glibc headers
../../src/glibc-2.7/configure --prefix=/usr --host=$target --with-headers=$prefix/usr/include
make install-headers install_root=$prefix
have error
../ports/sysdeps/arm/nptl/tls.h:48:3: error: #error "TLS support is required.
echo "libc_cv_forced_unwind=yes" > config.cache
echo "libc_cv_c_cleanup=yes" >> config.cache
echo "libc_cv_arm_tls=yes" >> config.cache
maybe can avoid this error.
touch ${prefix}/usr/include/bits/stdio_lim.h  //复制编译后续编译所要的头文件
touch ${prefix}/usr/include/gnu/stubs.h
五 编译gcc(第一遍)
第一次编译gcc只是为了产生针对target用的编译工具,因此不需要头文件和特别注意的,当然要注意满足target的要求。
$ cd ~/tar/src
$ tar -zvxf ../gcc-core-4.3.3.tar.gz
从 GCC-4.3起,安装GCC将依赖于GMP-4.1以上版本和MPFR-2.3.2以上版本。如果将这两个软件包分别解压到GCC源码树的根目录下,并分别命名为"gmp"和"mpfr",那么GCC的编译程序将自动将两者与GCC一起编译。建议尽可能使用最新的GMP和MPFR版本。
tar -zvxf ../mpfr-2.4.1.tar.gz
tar -zvxf ../gmp-4.3.0.tar.gz
mv mpfr-2.4.1 gcc-4.3.3/mpfr
mv gmp-4.3.0 gcc-4.3.3/gmp
由于第一次安装ARM交叉编译工具,那么支持的libc库的头文件也没有!所以我们征用Dinhibit_libc来解决这个问题。操作如下:
$ cd gcc-4.3.3/gcc/config/arm
$ mv t-linux t-linux-orig
$ sed 's/TARGET_LIBGCC2_CFLAGS =/TARGET_LIBGCC2_CFLAGS = -D__gthr_posix_h -Dinhibit_libc/'  t-linux-core
$ cp t-linux-core t-linux
编译
$ cd ~/tar/build
$ mkdir gcc-core
$ cd gcc-core
$ ../../src/gcc-4.3.3/configure \
--target=$target \
--prefix=$prefix \
--enable-languages=c \
--disable-shared \
--disable-threads \
--disable-libmudflap \
--disable-libssp \
--with-sysroot=$prefix
$ make all-gcc
$ make install-gcc
$ make all-target-libgcc (this step and next should do, or the following glibc compiling will fail because scare of gcc .a library)
$ make install-target-libgcc
七、编译glibc
$ cd ~/tar/src
$ tar -zvxf ../glibc-2.7.tar.gz
$ tar -zvxf ../glibc-ports-2.7.tar.gz
$ mv -v glibc-ports-2.7 glibc-2.7/ports
$ cd glibc-2.7
patch -Np1 -i ../../patch/glibc-2.7-alpha_ioperm_fix-1.patch
patch -Np1 -i ../../patch/glibc-2.7-alpha_PTR_MANGLE_fix-1.patch
patch -Np1 -i ../../patch/glibc-2.7-branch_update-1.patch
patch -Np1 -i ../../patch/glibc-2.7-branch_update-1A.patch
patch -Np1 -i ../../patch/glibc-2.7-libgcc_eh-1.patch
patch -Np1 -i ../../patch/glibc-2.7-localedef_segfault-1.patch
从gcc4.3开始将一部分头文件放到另一个文件夹中,导致glibc找不到,对glibc的configure做补丁(至于原因可以参见configure文件里的注释):
$ sed -i -e "/ccheaders=/s@\`\(\$CC.*include\)\`@\"& -isystem \`\1-fixed\`\"@" configure
为了编译通过修改的文件
$ sed -i 's/# define UNDOCARGS_5\tUNDOCARGS_4/&\n\n# define DOCARGS_6\tDOCARGS_5\n# define UNDOCARGS_6\tUNDOCARGS_5/' ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h
在文件ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h,增加这一句 #include
编译:
$ cd ~/tar/build
$ mkdir glibc
$ cd glibc
$ CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib \
../../src/glibc-2.7/configure \
--host=arm-linux \
--prefix=$prefix \
--enable-add-ons \
--with-headers=$prefix/usr/include \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes
$ make
$ make install
八、编译gcc(第二遍)
恢复先前的t-linux文件:
$ cd ~/tar/src
$ cd gcc-4.3.3/gcc/config/arm
$ mv t-linux t-linux.bak
$ mv t-linux-orig t-linux
解压缩 c++ 编译器源码包:
$ cd ~/tar/src
$ tar -zvxf ../gcc-g++-4.3.3.tar.gz
编译c、c++编译器:
$ cd ~/tar/BuildDir/gcc-core
$ make clean
$ make distclean
$ ../../src/gcc-4.3.3/configure \
--target=$target \
--prefix=$prefix \
--enable-languages=c \
--enable-threads=posix \
--enable-shared \
--enable-__cxa_atexit \
--disable-multilib \
--disable-nls
--with-local-prefix=$prefix
$ make all
$ make install
make all AS_FOR_TARGET="${target}-as" \
    LD_FOR_TARGET="${target}-ld"
error for scare of pthread.h(maybe glibc error)
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/60303/showart_2150856.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP