- 论坛徽章:
- 0
|
从源码构建本地编译GUN/Linux系统(gcc-4.3.1)
本文解决如下问题:
以 Sysroot 方式,从源码构建本地编译的 GUN/Linux 系统。
官方 CLFS-Sysroot x86 方法中 Basic System 为交叉编译产物,本文方法中 Basic System 本地编译生成。
官方 CLFS-Sysroot 无 x86_64 系统构建方法,本文提供 CLFS-Sysroot x86_64-Pure64 方法,并且 Basic System 本地编译生成。
理论上,本文提供的方法亦适用其它平台架构。不具备本地编译条件的嵌入式平台请使用官方方法。
升级到 gcc-4.3.1 。 本文为
Sysroot 方式从源码构建完全本地编译的 GUN/Linux 系统
升级姊妹篇
宿主系统需求:
- 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用户准备工作
全局设置
代码: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
建立工作目录、用户、用户环境
代码: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 ${NEW_OS_DIR}/.bashrc > ${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}
建立目标系统目录结构
代码: 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
宿主安装gmp-4.2.2
代码: ./configure --prefix=/usr \
--enable-cxx \
--enable-mpbsd
make
make install
宿主安装mpfr-2.3.1
代码: ./configure --prefix=/usr \
--enable-shared
make
make install一、${NEW_OS_USER} 用户建立交叉工具链
linux-header-2.6.25.7
代码:HOMEPAGE="http://www.kernel.org/"
SOURCE_URL="http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.7.tar.bz2
http://www.kernel.org/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/
}
glibc-header-2.7
代码:HOMEPAGE="http://www.gnu.org/software/libc/"
SOURCE_URL="http://ftp.gnu.org/gnu/glibc/glibc-2.7.tar.bz2
http://ftp.gnu.org/gnu/glibc/glibc-2.7.tar.bz2.sig
http://ftp.gnu.org/gnu/glibc/glibc-ports-2.7.tar.bz2
http://ftp.gnu.org/gnu/glibc/glibc-ports-2.7.tar.bz2.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
}
binutils-2.18
代码:HOMEPAGE="http://www.gnu.org/software/binutils/"
SOURCE_URL="http://ftp.gnu.org/gnu/binutils/binutils-2.18.tar.bz2
http://ftp.gnu.org/gnu/binutils/binutils-2.18.tar.bz2.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/
}
gcc-static-4.3.1
代码: HOMEPAGE="http://gcc.gnu.org/"
SOURCE_URL="http://ftp.gnu.org/gnu/gcc/gcc-4.3.1/gcc-4.3.1.tar.bz2
http://ftp.gnu.org/gnu/gcc/gcc-4.3.1/gcc-4.3.1.tar.bz2.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。
glibc-2.7
代码: HOMEPAGE="http://www.gnu.org/software/libc/"
SOURCE_URL="http://ftp.gnu.org/gnu/glibc/glibc-2.7.tar.bz2
http://ftp.gnu.org/gnu/glibc/glibc-2.7.tar.bz2.sig
http://ftp.gnu.org/gnu/glibc/glibc-ports-2.7.tar.bz2
http://ftp.gnu.org/gnu/glibc/glibc-ports-2.7.tar.bz2.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 ${ROOTFS}/etc/ld.so.conf
gcc-4.3.1
代码: HOMEPAGE="http://gcc.gnu.org/"
SOURCE_URL="http://ftp.gnu.org/gnu/gcc/gcc-4.3.1/gcc-4.3.1.tar.bz2
http://ftp.gnu.org/gnu/gcc/gcc-4.3.1/gcc-4.3.1.tar.bz2.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会根据系统信息配置。
所以伪交叉编译时会出问题,具体见
用GCC 4.3-20040810构造SYSROOT工具链
,特别说明,这个不是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。
binutils-2.18
gmp-4.2.2
mpfr-2.3.1
gcc-4.3.1
ncurses-5.6
bash-3.2
bzip2-1.0.4
coreutils-6.9
diffutils-2.8.7
findutils-4.2.33
zlib-1.2.3
file-4.23
gawk-3.1.6
gettext-0.17
grep-2.5.3
gzip-1.3.12
make-3.81
patch-2.5.9
sed-4.1.5
tar-1.20
texinfo-4.11
e2fsprogs-1.40.2
sysvinit-2.86
module-init-tools-3.2.2
util-linux-ng-2.13.1
udev-118
shadow-4.1.1
linux-2.6.25.7 三、root 用户处理交叉编译临时系统
四、boot/chroot进入交叉编译临时系统,建立本地编译基本系统
base-filesystem-0
linux-header-2.6.25.7
glibc-2.7
binutils-2.18
gmp-4.2.2
mpfr-2.3.1
gcc-4.3.1
man-pages-3.00
sed-4.1.5
e2fsprogs-1.40.2
coreutils-6.9
iana-etc-2.20
m4-1.4.10
bison-2.3
ncurses-5.6
procps-3.2.7
libtool-1.5.26
flex-2.5.35
iproute2-2.6.23
perl-5.10.0
readline-5.2
zlib-1.2.3
autoconf-2.61
automake-1.10.1
bash-3.2
bzip2-1.0.4
diffutils-2.8.7
file-4.23
findutils-4.2.33
gawk-3.1.6
gettext-0.17
grep-2.5.3
groff-1.19.2
gzip-1.3.12
inetutils-1.5
kbd-1.12
less-418
make-3.81
man-1.6f
mktemp-1.5
module-init-tools-3.2.2
patch-2.5.9
psmisc-22.6
Linux-PAM-0.99.10.0
shadow-4.1.1
sysklogd-1.5
sysvinit-2.86
tar-1.20
texinfo-4.11
udev-118
util-linux-ng-2.13.1
vim-7.1
linux-2.6.25.7
iptables-1.4.0
gpm-1.20.5
net-tools-1.60
dhcp-4.0.0
libgpg-error-1.6
libgcrypt-1.4.0
gnutls-2.3.1
openssl-0.9.8g
wget-1.11
lynx2-8-6
openssh-4.7p1
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也不行
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/39544/showart_1010369.html |
|