Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25786
  • 博文数量: 14
  • 博客积分: 31
  • 博客等级: 民兵
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-16 22:29
文章分类
文章存档

2012年(14)

我的朋友

分类:

2012-05-25 20:18:11

从源码构建本地编译GUN/Linux系统(gcc-4.3.1)

本文解决如下问题:
  1. 以 Sysroot 方式,从源码构建本地编译的 GUN/Linux 系统。
  2. 官方 CLFS-Sysroot x86 方法中 Basic System 为交叉编译产物,本文方法中 Basic System 本地编译生成。
  3. 官方 CLFS-Sysroot 无 x86_64 系统构建方法,本文提供 CLFS-Sysroot x86_64-Pure64 方法,并且 Basic System 本地编译生成。
  4. 理论上,本文提供的方法亦适用其它平台架构。不具备本地编译条件的嵌入式平台请使用官方方法。
  5. 升级到 gcc-4.3.1 。
本文为 升级姊妹篇

宿主系统需求:
  • Bash-2.05a
  • Binutils-2.12
  • Bison-1.26a
  • Bzip2-1.0.2
  • Coreutils-5.0
  • Diffutils-2.8
  • Findutils-4.1.20
  • Gawk-3.0
  • Gcc-2.95.3
  • Glibc-2.2.5
  • Grep-2.5
  • Gzip-1.2.4
  • Make-3.79.1
  • Patch-2.5.4
  • Sed-3.0.2
  • Tar-1.14
  • Texinfo
  • file-4.21
  • perl
  • gmp-4.2.2
  • mpfr-2.3.1
具体过程如下:(适用于x86/x86_64,摘自笔者编译脚本)

〇、root用户准备工作
  1. 全局设置
    代码:
    NEW_OS=x86_64-linux-gnu #自定义,用于工作目录、用户名 NEW_OS_ARCH=x86_64 #处理器架构,x86系统请修改为i386 NEW_OS_TARGET=x86_64-unknown-linux-gnu #目标系统类型,x86系统请根据自己需要修改,如i686-pc-linux-gnu NEW_OS_HOST=$(echo ${MACHTYPE} | sed -e "s@$(echo ${MACHTYPE} | cut -d- -f2)@cross@") NEW_OS_MARCH=$(echo ${NEW_OS_TARGET} | cut -d- -f1) NEW_OS_DIR=/${NEW_OS} SOURCE=${NEW_OS_DIR}/source TOOLS=${NEW_OS_DIR}/tools PACKAGE=${NEW_OS_DIR}/package MARK=${NEW_OS_DIR}/mark ROOTFS=${NEW_OS_DIR}/rootfs FAKEROOT=${NEW_OS_DIR}/fakeroot NEW_OS_NO_LIB64_DIR=yes NEW_OS_USER=${NEW_OS} NEW_OS_ID=1000
  2. 建立工作目录、用户、用户环境
    代码:
    mkdir -pv ${NEW_OS_DIR}/bin \ ${SOURCE} \ ${TOOLS} \ ${PACKAGE} \ ${MARK} \ ${ROOTFS} \ ${FAKEROOT} touch ${NEW_OS_DIR}/${NEW_OS_TARGET} cp -a ${NEW_OS_SCRIPT_DIR} ${NEW_OS_DIR}/bin groupadd -o -g ${NEW_OS_ID} ${NEW_OS_USER} useradd -o -d ${NEW_OS_DIR} -u ${NEW_OS_ID} -g ${NEW_OS_ID} -s /bin/bash ${NEW_OS_USER} passwd ${NEW_OS_USER} cat > ${NEW_OS_DIR}/.bash_profile << eof exec env -i HOME=\${HOME} TERM=\${TERM} PS1='\u@\h:\w\\$ ' /bin/bash eof cat > ${NEW_OS_DIR}/.bashrc << eof set +h umask 022 export LC_ALL=POSIX export PATH=${TOOLS}/bin:/usr/bin:/bin eof echo "export NEW_OS=${NEW_OS}" >> ${NEW_OS_DIR}/.bashrc echo "export NEW_OS_ARCH=${NEW_OS_ARCH}" >> ${NEW_OS_DIR}/.bashrc echo "export NEW_OS_TARGET=${NEW_OS_TARGET}" >> ${NEW_OS_DIR}/.bashrc echo "export NEW_OS_HOST=${NEW_OS_HOST}" >> ${NEW_OS_DIR}/.bashrc echo "export NEW_OS_MARCH=${NEW_OS_MARCH}" >> ${NEW_OS_DIR}/.bashrc echo "export NEW_OS_DIR=${NEW_OS_DIR}" >> ${NEW_OS_DIR}/.bashrc echo "export SOURCE=${SOURCE}" >> ${NEW_OS_DIR}/.bashrc echo "export TOOLS=${TOOLS}" >> ${NEW_OS_DIR}/.bashrc echo "export PACKAGE=${PACKAGE}" >> ${NEW_OS_DIR}/.bashrc echo "export MARK=${MARK}" >> ${NEW_OS_DIR}/.bashrc echo "export ROOTFS=${ROOTFS}" >> ${NEW_OS_DIR}/.bashrc echo "export FAKEROOT=${FAKEROOT}" >> ${NEW_OS_DIR}/.bashrc echo "unset CFLAGS" >> ${NEW_OS_DIR}/.bashrc echo "unset CXXFLAGS" >> ${NEW_OS_DIR}/.bashrc chown -R ${NEW_OS_ID}.${NEW_OS_ID} ${NEW_OS_DIR}
  3. 建立目标系统目录结构
    代码:
    mkdir -pv ${ROOTFS}/{bin,boot,dev,etc/{ramdisk,opt},home,initrd,lib,media,mnt,opt,proc,root,sbin,srv,sys,tmp,usr,var} mkdir -pv ${ROOTFS}/usr{,/local}/{bin,include,lib,sbin,share,src} mkdir -pv ${ROOTFS}/usr{,/local}/share/{doc,info,locale,man,misc,terminfo,zoneinfo} ln -sfv share/{doc,info,man} ${ROOTFS}/usr ln -sfv share/{doc,info,man} ${ROOTFS}/usr/local mkdir -pv ${ROOTFS}/usr{,/local}/share/man/man{1,2,3,4,5,6,7,8} mkdir -pv ${ROOTFS}/var/{cache,lib/{misc,locate},local,lock,log,mail,opt,run,spool,tmp} chmod 0750 ${ROOTFS}/root chmod 1777 ${ROOTFS}/{,var/}tmp
  4. 宿主安装gmp-4.2.2
    代码:
    ./configure --prefix=/usr \ --enable-cxx \ --enable-mpbsd make make install
  5. 宿主安装mpfr-2.3.1
    代码:
    ./configure --prefix=/usr \ --enable-shared make make install
一、${NEW_OS_USER} 用户建立交叉工具链
  1. linux-header-2.6.25.7
    代码:
    HOMEPAGE="" SOURCE_URL="pub/linux/kernel/v2.6/linux-2.6.25.7.tar.bz2 pub/linux/kernel/v2.6/linux-2.6.25.7.tar.bz2.sign" SOURCE_MD5="" PACKAGE_NAME=linux-header PACKAGE_VERSION=2.6.25.7 SOURCE_DIR=${SOURCE}/linux-${PACKAGE_VERSION} BUILD_DIR= source_tree() { cd ${SOURCE} tar -xvf linux-${PACKAGE_VERSION}.tar.bz2 cd ${SOURCE_DIR} make mrproper } source_config() { echo "source_config" } source_build() { cd ${SOURCE_DIR} make ARCH=${NEW_OS_ARCH} INSTALL_HDR_PATH=header_dir headers_install mkdir -pv ${ROOTFS}/usr cp -av header_dir/include ${ROOTFS}/usr/ }
  2. glibc-header-2.7
    代码:
    HOMEPAGE="" SOURCE_URL=" .sig .sig" SOURCE_MD5="" SOURCE_DIR=${SOURCE}/glibc-${PACKAGE_VERSION} BUILD_DIR=${SOURCE}/glibc-build source_tree() { cd ${SOURCE} tar -xvf glibc-${PACKAGE_VERSION}.tar.bz2 tar -xvf glibc-ports-${PACKAGE_VERSION}.tar.bz2 mv -v glibc-ports-${PACKAGE_VERSION} ${SOURCE_DIR}/ports cd ${SOURCE_DIR} sed -i -e "s@/etc/mtab@/etc/ramdisk/mtab@" sysdeps/unix/sysv/linux/paths.h mkdir -pv ${BUILD_DIR} } source_config() { cd ${BUILD_DIR} echo "libc_cv_forced_unwind=yes" >> config.cache echo "libc_cv_c_cleanup=yes" >> config.cache echo "libc_cv_${NEW_OS_ARCH}_tls=yes" >> config.cache if [ "${NEW_OS_ARCH}" = "i386" ]; then echo "libc_cv_386_tls=yes" >> config.cache echo "CFLAGS+=-march=${NEW_OS_MARCH}" >> configparms fi echo "install_root=${ROOTFS}" >> configparms echo "slibdir=/lib" >> configparms CC=gcc ${SOURCE_DIR}/configure --prefix=/usr \ --host=${NEW_OS_TARGET} \ --build=${NEW_OS_HOST} \ --with-headers=${ROOTFS}/usr/include \ --cache-file=config.cache } source_build() { cd ${BUILD_DIR} make install-headers mkdir -pv ${ROOTFS}/usr/include/bits cp -v bits/stdio_lim.h ${ROOTFS}/usr/include/bits/ mkdir -pv ${ROOTFS}/usr/include/gnu touch ${ROOTFS}/usr/include/gnu/stubs{,-32,-64}.h }
  3. binutils-2.18
    代码:
    HOMEPAGE="" SOURCE_URL=" .sig" SOURCE_MD5="" SOURCE_DIR=${SOURCE}/${PACKAGE_NAME}-${PACKAGE_VERSION} BUILD_DIR=${SOURCE}/${PACKAGE_NAME}-build source_tree() { cd ${SOURCE} tar -xvf ${PACKAGE_NAME}-${PACKAGE_VERSION}.tar.bz2 cd ${SOURCE_DIR} #posix sed -i -e "s@tail +16c@tail -c +16@g" $(grep -lr "tail +16c" *) sed -i -e "s@tail +140@tail -n +140@g" $(grep -lr "tail +140" *) sed -i -e "s@head -1@head -n 1@g" $(grep -lr "head -1" *) #support texinfo 4.11 sed -i -e "s@4\\\.\[4-9\]@&|4\\\.11@" configure #--disable-multilib /lib64->/lib if [ "${NEW_OS_NO_LIB64_DIR}" = "yes" ]; then sed -i -e "s@/lib64/ld@/lib/ld@g" ld/configure.host fi mkdir -pv ${BUILD_DIR} } source_config() { cd ${BUILD_DIR} if [ "${NEW_OS_ARCH}" = "x86_64" ]; then CONFPARMS=--enable-64-bit-bfd else CONFPARMS= fi AR=ar AS=as ${SOURCE_DIR}/configure --prefix=${TOOLS} \ --build=${NEW_OS_HOST} \ --host=${NEW_OS_HOST} \ --target=${NEW_OS_TARGET} \ --with-sysroot=${ROOTFS} \ --disable-nls \ --enable-shared \ --disable-multilib ${CONFPARMS} } source_build() { cd ${BUILD_DIR} make configure-host make make install mkdir -pv ${ROOTFS}/usr/include cp -v ${SOURCE_DIR}/include/libiberty.h ${ROOTFS}/usr/include/ }
  4. gcc-static-4.3.1
    代码:
    HOMEPAGE="" SOURCE_URL=" .sig" SOURCE_MD5="" SOURCE_DIR=${SOURCE}/gcc-${PACKAGE_VERSION} BUILD_DIR=${SOURCE}/gcc-build source_tree() { cd ${SOURCE} tar -xvf gcc-${PACKAGE_VERSION}.tar.bz2 cd ${SOURCE_DIR} #posix sed -i -e "s@tail -1@tail -n 1@g" $(grep -lr "tail -1" *) sed -i -e "s@tail -3@tail -n 3@g" $(grep -lr "tail -3" *) sed -i -e "s@head -1@head -n 1@g" $(grep -lr "head -1" *) #--disable-multilib /lib64->/lib if [ "${NEW_OS_NO_LIB64_DIR}" = "yes" ]; then sed -i -e "s@/lib64/ld@/lib/ld@g" gcc/config/*/linux64.h sed -i -e "s@../lib32 ../lib ../lib64@../lib32 ../lib ../lib@g" \ -e "s@../lib64 ../lib@../lib ../lib@g" \ -e "s@../lib64@../lib@g" gcc/config/*/t-linux64 fi #cross hacking sed -i -e "s@/usr/libexec/gcc/@@g" -e "s@/usr/lib/gcc/@@g" gcc/gcc.c #cross hacking sed -i 's@$(GCC_FOR_TARGET) -dumpspecs@echo -n@' gcc/Makefile.in mkdir -pv ${BUILD_DIR} } source_config() { cd ${BUILD_DIR} AR=ar \ CC_FOR_TARGET=${NEW_OS_TARGET}-gcc \ ${SOURCE_DIR}/configure --prefix=${TOOLS} \ --build=${NEW_OS_HOST} \ --host=${NEW_OS_HOST} \ --target=${NEW_OS_TARGET} \ --with-sysroot=${ROOTFS} \ --disable-nls \ --disable-shared \ --enable-languages=c \ --disable-multilib } source_build() { cd ${BUILD_DIR} make all-gcc make install-gcc make all-target-libgcc make install-target-libgcc }

    注意:
    这里用补丁建立空spec文件,否则交叉编译会出错,伪交叉编译会引人宿主gcc spec。
  5. glibc-2.7
    代码:
    HOMEPAGE="" SOURCE_URL=" .sig .sig" SOURCE_MD5="" SOURCE_DIR=${SOURCE}/${PACKAGE_NAME}-${PACKAGE_VERSION} BUILD_DIR=${SOURCE}/${PACKAGE_NAME}-build source_tree() { cd ${SOURCE} tar -xvf ${PACKAGE_NAME}-${PACKAGE_VERSION}.tar.bz2 tar -xvf ${PACKAGE_NAME}-ports-${PACKAGE_VERSION}.tar.bz2 mv -v ${PACKAGE_NAME}-ports-${PACKAGE_VERSION} ${SOURCE_DIR}/ports cd ${SOURCE_DIR} sed -i -e "s@/etc/mtab@/etc/ramdisk/mtab@" sysdeps/unix/sysv/linux/paths.h #libgcc_eh cross hacking sed -i -e "s@-lgcc_eh@@g" Makeconfig #for gcc-4.3.1 sed -i 's@-nostdinc -isystem $ccheaders@& -isystem $ccheaders-fixed@' configure mkdir -pv ${BUILD_DIR} } source_config() { cd ${BUILD_DIR} echo "libc_cv_forced_unwind=yes" >> config.cache echo "libc_cv_c_cleanup=yes" >> config.cache echo "libc_cv_${NEW_OS_ARCH}_tls=yes" >> config.cache if [ "${NEW_OS_ARCH}" = "i386" ]; then echo "libc_cv_386_tls=yes" >> config.cache echo "CFLAGS+=-march=${NEW_OS_MARCH}" >> configparms fi echo "install_root=${ROOTFS}" >> configparms echo "slibdir=/lib" >> configparms BUILD_CC=gcc \ CC=${NEW_OS_TARGET}-gcc \ AR=${NEW_OS_TARGET}-ar \ RANLIB=${NEW_OS_TARGET}-ranlib \ CFLAGS="-mtune=generic -g -O2" \ ${SOURCE_DIR}/configure --prefix=/usr \ --build=${NEW_OS_HOST} \ --host=${NEW_OS_TARGET} \ --target=${NEW_OS_TARGET} \ --with-headers=${ROOTFS}/usr/include \ --libdir=/usr/lib \ --libexecdir=/usr/lib/glibc \ --disable-profile \ --enable-add-ons \ --with-tls \ --enable-kernel=2.6.0 \ --with-__thread \ --with-binutils=${TOOLS}/bin \ --cache-file=config.cache } source_build() { cd ${BUILD_DIR} make #--disable-multilib /lib64->/lib if [ "${NEW_OS_NO_LIB64_DIR}" = "yes" ]; then sed -i -e "s@/lib64/ld@/lib/ld@" elf/ldd fi make install mkdir -pv ${ROOTFS}/etc/ramdisk ln -sfv ramdisk/mtab ${ROOTFS}/etc/mtab ln -sfv ramdisk/resolv.conf ${ROOTFS}/etc/resolv.conf mkdir -pv ${ROOTFS}/lib ln -sfv libcrypt-2.7.so ${ROOTFS}/lib/libcrypt.so cat > ${ROOTFS}/etc/nsswitch.conf << eof #begin /etc/nsswitch.conf passwd: files group: files shadow: files hosts: files dns networks: files protocols: files services: files ethers: files rpc: files #end /etc/nsswitch.conf eof cat > ${ROOTFS}/etc/ld.so.conf << eof #begin /etc/ld.so.conf #end /etc/ld.so.conf eof }
  6. gcc-4.3.1
    代码:
    HOMEPAGE="" SOURCE_URL=" .sig" SOURCE_MD5="" SOURCE_DIR=${SOURCE}/${PACKAGE_NAME}-${PACKAGE_VERSION} BUILD_DIR=${SOURCE}/${PACKAGE_NAME}-build source_tree() { cd ${SOURCE} tar -xvf ${PACKAGE_NAME}-${PACKAGE_VERSION}.tar.bz2 cd ${SOURCE_DIR} #posix sed -i -e "s@tail -1@tail -n 1@g" $(grep -lr "tail -1" *) sed -i -e "s@tail -3@tail -n 3@g" $(grep -lr "tail -3" *) sed -i -e "s@head -1@head -n 1@g" $(grep -lr "head -1" *) #--disable-multilib /lib64->/lib if [ "${NEW_OS_NO_LIB64_DIR}" = "yes" ]; then sed -i -e "s@/lib64/ld@/lib/ld@g" gcc/config/*/linux64.h sed -i -e "s@../lib32 ../lib ../lib64@../lib32 ../lib ../lib@g" \ -e "s@../lib64 ../lib@../lib ../lib@g" \ -e "s@../lib64@../lib@g" gcc/config/*/t-linux64 fi #cross hacking sed -i -e "s@/usr/libexec/gcc/@@g" -e "s@/usr/lib/gcc/@@g" gcc/gcc.c mkdir -pv ${BUILD_DIR} } source_config() { cd ${BUILD_DIR} AR=ar \ CC_FOR_TARGET=${NEW_OS_TARGET}-gcc \ CXX_FOR_TARGET=${NEW_OS_TARGET}-g++ \ ${SOURCE_DIR}/configure --prefix=${TOOLS} \ --build=${NEW_OS_HOST} \ --host=${NEW_OS_HOST} \ --target=${NEW_OS_TARGET} \ --with-sysroot=${ROOTFS} \ --disable-nls \ --enable-shared \ --enable-languages=c,c++ \ --enable-__cxa_atexit \ --enable-c99 \ --enable-long-long \ --enable-threads=posix \ --disable-multilib } source_build() { cd ${BUILD_DIR} make make install }

    注意:
    建立工具链时,这里特别添加了--build=${NEW_OS_HOST},这是gcc-4.3系列与之前版本的区别,之前版本gcc配置时探测到 --host --target 不同,会自动设置--build与--host相同,但gcc-4.3会根据系统信息配置。
    所以伪交叉编译时会出问题,具体见
    ,特别说明,这个不是bug,添加--build后可以正常编译不需额外补丁。
    为统一,建立交叉工具链时均加上--build=${NEW_OS_HOST}。
二、${NEW_OS_USER} 用户交叉编译临时系统
注意:
为统一,与建立交叉工具链类似,1-4编译时特别添加 --target=${NEW_OS_TARGET}。
交叉编译
mpfr-2.3.1时,需要使用--with-gmp-build指明gmp交叉编译目录,否则有恼人的错误引用问题,伪交叉编译时则会连接到宿主libgmp.so。
  1. binutils-2.18
  2. gmp-4.2.2
  3. mpfr-2.3.1
  4. gcc-4.3.1
  5. ncurses-5.6
  6. bash-3.2
  7. bzip2-1.0.4
  8. coreutils-6.9
  9. diffutils-2.8.7
  10. findutils-4.2.33
  11. zlib-1.2.3
  12. file-4.23
  13. gawk-3.1.6
  14. gettext-0.17
  15. grep-2.5.3
  16. gzip-1.3.12
  17. make-3.81
  18. patch-2.5.9
  19. sed-4.1.5
  20. tar-1.20
  21. texinfo-4.11
  22. e2fsprogs-1.40.2
  23. sysvinit-2.86
  24. module-init-tools-3.2.2
  25. util-linux-ng-2.13.1
  26. udev-118
  27. shadow-4.1.1
  28. linux-2.6.25.7
三、root 用户处理交叉编译临时系统
四、boot/chroot进入交叉编译临时系统,建立本地编译基本系统
  1. base-filesystem-0
  2. linux-header-2.6.25.7
  3. glibc-2.7
  4. binutils-2.18
  5. gmp-4.2.2
  6. mpfr-2.3.1
  7. gcc-4.3.1
  8. man-pages-3.00
  9. sed-4.1.5
  10. e2fsprogs-1.40.2
  11. coreutils-6.9
  12. iana-etc-2.20
  13. m4-1.4.10
  14. bison-2.3
  15. ncurses-5.6
  16. procps-3.2.7
  17. libtool-1.5.26
  18. flex-2.5.35
  19. iproute2-2.6.23
  20. perl-5.10.0
  21. readline-5.2
  22. zlib-1.2.3
  23. autoconf-2.61
  24. automake-1.10.1
  25. bash-3.2
  26. bzip2-1.0.4
  27. diffutils-2.8.7
  28. file-4.23
  29. findutils-4.2.33
  30. gawk-3.1.6
  31. gettext-0.17
  32. grep-2.5.3
  33. groff-1.19.2
  34. gzip-1.3.12
  35. inetutils-1.5
  36. kbd-1.12
  37. less-418
  38. make-3.81
  39. man-1.6f
  40. mktemp-1.5
  41. module-init-tools-3.2.2
  42. patch-2.5.9
  43. psmisc-22.6
  44. Linux-PAM-0.99.10.0
  45. shadow-4.1.1
  46. sysklogd-1.5
  47. sysvinit-2.86
  48. tar-1.20
  49. texinfo-4.11
  50. udev-118
  51. util-linux-ng-2.13.1
  52. vim-7.1
  53. linux-2.6.25.7
  54. iptables-1.4.0
  55. gpm-1.20.5
  56. net-tools-1.60
  57. dhcp-4.0.0
  58. libgpg-error-1.6
  59. libgcrypt-1.4.0
  60. gnutls-2.3.1
  61. openssl-0.9.8g
  62. wget-1.11
  63. lynx2-8-6
  64. openssh-4.7p1
  65. pkg-config-0.23
本文使用的简化编译脚本已附,命名以自解释为原则。
回头看看,自己改的东西太多,一点一点贴上来太麻烦。
使用帮助,请执行./new_os.sh。
不显式挂载分区,重写的简化启动脚本,完全自定制(也就是说不一定适合每个人),请有选择的参考。
另,请不要与官方alfs比较,用途不同。


与gcc-4.3.1不兼容软件包列表:
tar-1.19,升级到tar-1.20解决。
scim-pinyin-0.5.91,添加#include 解决。
scim-fcitx-3.1.1,添加#include 解决。
kvm-68,暂未解决,可能是内核头文件引起的,gcc-3.3.6也不行
qemu-0.9.1,暂未解决,可能是内核头文件引起的,gcc-3.3.6也不行
阅读(1023) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~