Jagen 发表于 2008-1-20 01:36:11

Magic Linux开发入门指南(一)

    制作一个Linux发布难吗?
    很难。
    制作一个Linux发布版需要很高深的技术吗?
    你能行。

    好多人很想参与Magic Linux的开发,但多数不知从何入手。
    其实很简单,你只需要一台供你支配的386以上配置且能够上网的电脑,
以及一个能够工作在其上的gcc环境。
    对,这就够了,其他的软件都是在帮助你更快的、更简便的完成这个工
作。因为Linux源自于网络,发展于网络,能够上网才能得到Linux;Linux
自身及在其之上运行的大多数软件都是以源代码方式提供,且非gcc不能完成
内核的编译。拥有了这些,你就可以开始将这些源代码转化为可运行的内核、
Shell和一些应用软件,一点一点的就构成了一个完整的可用的Linux系统。
    本文就是讲述如何开始这些工作的。我会假定你对Linux有一定的了解,
使用过如:cp、mv、rm等常用命令,曾经成功的在某个Linux系统中安装过某个
以源代码形式发布的软件,有一些C/C++或其他语言的经验。
    另外,我所提到的gcc环境并不是单指gcc本身,而是一些与gcc相交织的
软件集合,它们共同工作,完成从源代码到可执行程序的转换过程,这个过程
一般被称之为创建。

第一章 工具链的制作

    在正式开始前,我还要让你了解一个重要的知识,那就是编译器、连接器
和程序库他们三者之间的关系,如果你已经非常了解了,可以略过这些内容。
编译器只是将源代码翻译成对应的机器代码,但是这个时候这些代码是不能执
行的,因为既没有排列好执行顺序也没有指定从哪里开始;程序库实现了一些
程序必要的行为,比如你要输出一些内容到屏幕或从键盘获得输入等;连接器
将编译器产生的机器代码进行排序并告诉计算机(严格来讲是操作系统)从什么
地方开始执行,当程序需要输出一些内容到屏幕或从键盘获得输入时,请求程
序库完成这些事情。虽然这些说法显得很不专业,但是足以帮助你理解它们三
者之间的关系了。如果要获得更为专业、详细的知识请阅读相关专业书籍。
    一个能够正常工作的gcc环境,需要三个源代码包的支持:binutils、
gcc和glibc,它们分别提供了连接器、编译器和程序库。其实他们并不仅仅提
供了这些内容:
    binutils是一个二进制工具集合,包含了汇编器、反汇编器、连接器、
elf可执行文件分析器等重要工具,这些工具在进行Linux各种应用的开发时,
发挥着巨大的作用。你可以在/usr/bin目录中找到他们。
    gcc是一个编译器集合,包含了C、C++、Objective-C、Fortran、Java和
Ada语言,同时为这些语言提供了一些标准库,如:libstdc++、libgcj,……。
gcc的C是Linux的标准编译器,linux内核完全依赖于gcc,其他编译器不能编译
linux内核。由于ABI(Application Binary Interface)的不兼容,其他编译器
也不适合Linux上的大多数软件的编译,尤其那些使用C++作为开发语言的软件系
统。目前Intel C/C++编译器开始兼容gcc的ABI,因此现在可以采用Intel C/C++
编译器创建Linux上使用C/C++开发的软件系统,但内核不行。gcc被安装在
/usr/bin、/usr/lib和/usr/include目录中。
    glibc是提供系统调用和基本函数的C库,比如open,malloc,printf等等,
所有动态连接的程序都要用到它。它是用户程序与内核交流的标准接口。
    这三个包在一起相互作用,来完成Linux的所有创建任务。除了glibc是自包
含(自己依赖于自己)的外,其他两个都要依赖于glibc,同时glibc会与具体的内
核版本有一定的依赖性,但这并不是绝对的。注意,他们都是用gcc编译,并用
binutils的连接器进行连接的。这里就比较有趣了,是先有鸡还是先有蛋呢?计
算机的发展史咱们就不必讨论了,在本章会详细介绍如何来让他们的代码执行起
来。但他们不是我们要的全部。

    首先,你应该保证你有可用的gcc环境,能够用它让你的源代码变成可执行程
序。往往这需要你的计算机运行了某个版本的Linux发布。当然Windows也行,不
过会比较麻烦,我不建议你这么做,我也不会在这里讨论该怎么做。你也不要指
望你现在的这个gcc环境可以直接创建Magic Linux的所有,最后你得到的还是属
于你现在使用的这个发布。因为你现在的gcc创建产生后的程序,还是依赖于你现
有Linux发布版的glibc的。如果你说你现在就创建一个glibc不就行了吗?不信你
可以试试,当你安装完后,看看你的系统还能工作不?言归正传,你现在急需的
是能够帮助你产生MagicLinux的gcc。

1.准备环境
    最好能在你的硬盘上划分出一个独立的分区,1G大小就够了。不过这个你都嫌
麻烦的话,你有1G以上的自由空间也行。现在我假设你划分了一个独立的分区。
    来吧,创建/mnt/ml目录,并将你的新分区挂接到这上面(如果不了解挂接的话,
先找找资料,google一下mount)。

#mkdir /mnt/ml
    #mount /dev/hda6 /mnt/ml (我假设你的新分区设备名为hda6)

cd到/mnt/ml目录并创建toolchain目录。

    #cd /mnt/ml
    #mkdir toolchain

在你的根目录创建一个连接到toolchain上(如果不了解,google一下ln)。

    #ln -sv /mnt/ml/toolchain /toolchain

创建sources目录。

    #mkdir sources

将binutils、gcc和glibc等的源代码复制到sources目录中。你可以在网络上找到它们,
google一下就行了。binutils的最新本版是2.18,源代码包可能是这样的文件名:
binutils-2.18.tar.bz2;gcc的最新本版是4.2.2,源代码包可能是这样的文件名:
gcc-4.2.2.tar.bz2;glibc的最新版本是2.7,源代码包可能是这样的文件名:
glibc-2.7.tar.bz2。
修改PATH环境变量。

    #export PATH=/toolchain/bin:$PATH

PATH环境变量指定了shell命令的默认搜索路径。我们修改PATH环境变量使得在你的gcc
可用时,默认执行的是它,而不是系统自带的。
    环境已经准备好了,我们开始吧。

2.创建新的gcc环境
    为了创建完全独立于你现有系统的gcc环境,我们要创建两次binutils和gcc。他们创
建的次序是很重要的。我们现在进行第一次创建。进入sources目录。

    #cd sources

2.1创建binutils
    首先创建binutils,是因为在创建gcc和glibc时,它们会检测连接器和汇编器,以便决定
它们能够开启那些特性。整个过程大概需要5分钟(根据你机器的处理能力会有很大的不
同),占用200MB左右的磁盘空间。
    解压缩源代码包,并进入解压后的目录:

    #tar -jvxf binutils-2.18.tar.gz
    #cd binutils-2.18

由于binutils在某些时候会有一点小问题,要修复它,需要下在一个补丁,对应2.18版本的
补丁是:binutils-2.18-configure-1.patch。

    #patch –Np1 -i ../binutils-2.18-configure-1.patch

binutils的文档说应该在一个独立的目录中创建binutils。那就创建一个build目录。

    #mkdir build
    #cd build

现在为创建binutils做准备工作:

    #CC=”gcc -B/usr/bin/”../configure \
    --prefix=/toolchain --disable-nls --disable-werror

各选项的含义是:
    CC=”gcc -B/usr/bin/”
告诉gcc使用你当前操作系统/usr/bin目录下的连接器。这个对于某些你使用的Linux
    发布是很重要的,因为新创建的连接器ld可能与它所提供的gcc不兼容。
    --prefix=/toolchain
    这个参数告诉configure脚本,把binutils软件包中的程序安装到/toolchina目录中,也就是
    /mnt/ml/toolchain。
    --disable-nls
    这个参数禁止了国际化(通常简称i18n)。此时根本不需要国际化支持。
    --disable-werror
    这个参数可以防止由于你的系统提供的gcc在产生警告事件时停止创建过程。
准备好了,我们可以创建了:

    #make

创建完成后,安装:

    #make install

别着急,还没完事。还得调整一下:

    #make –C ld clean
    #make –C ld LIB_PATH=/toolchain/lib

make参数的含义是:
    -C ld clean
    告诉make,删除所有子目录ld中编译生成的文件。
    -C ld LIB_PATH=/toolchain/lib
    这个选项重新编译ld子目录中的所有文件。LIB_PATH是Makefile的一个变量,
    在命令行里制定他,可以覆盖默认值,并让它指向/toolchain/lib目录。这个变量
    的值指定了连接器的缺省库搜索路径。
手工将新的程序复制到/toolchain/bin目录:

    #cp –v ld/ld-new /toolchain/bin

好了,binutils创建完成了,你现在可以删除build目录了。但是不要删除binutils-2.18目
录,因为还要编译一次呢。退回到sources目录,准备gcc的创建工作。

    #cd ../
    #rm –rf build
    #cd ../

2.2 创建gcc
    连接器准备好了,但我们这次先不使用它,没有这个必要,因为我们还需要再次
创建gcc的,那时再用也不迟。这个过程大概会花费你50分钟的时间和650MB的磁盘空
间。
    解压缩gcc的源代码包并进入源代码目录。

    #tar –jvxf gcc-4.2.2.tar.bz2
    #cd gcc-4.2.2

gcc与binutils一样,建议你在一个独立的目录中创建它。创建build目录。

    #mkdir build
    #cd build

为创建gcc做准备。

    #../configure –prefix=/toolchain –with-local-prefix=/toolchain \
    --disable-nls –enable-shared –enable-languages=c

各选项的含义是:
    CC=”gcc -B/usr/bin/”
    告诉gcc使用你当前操作系统/usr/bin目录下的连接器。也就是不使用你刚创建完
    的那个连接器ld。这也是为了避免一些麻烦,可以参考创建binutils时对该选项的
    说明。
    --with-local-prefix=/toolchain
    默认情况下,gcc会搜索两个include目录,一个是其安装目录下的include,这里是
    /toolchian/include,另外一个是/usr/local/include。这个选项就是将/usr/local/include这个默
    认搜索目录删除,而还是指向/toolchain/include。
    --enable-shared
    这个选项是为了创建出libgcc_s.so.1和libgcc_eh.a文件,因为下一个要创建的glibc需要
    libgcc_eh.a,要是没有它就不会产生正确的结果。
    --enable-languages=c
    因为gcc是一个编译器集合,这个选项指定要创建何种语言的编译器。此时只需要C,
    那就没什么可说的了。
准备好了,我们可以开始创建了:

    #make

创建完成,安装:

    #make install

最后你还应该创建一个符号连接cc到这个新的gcc,因为好多时候会用cc而不是gcc,这是为
了与Unix平台保持一致,便于程序的移植。

    #ln –vs gcc /toolchain/bin/cc

好了,gcc创建完成了,接下来的创建过程会自动使用这个gcc的,因为你修改了PATH环境变
量。做些首尾工作,要不然你的磁盘可能吃紧了。

    #cd ../
    #rm –rf build
    #cd ../

2.3创建glibc
    前面我说过,glibc是自包含的,不会依赖于那个软件包。但是我也说过,它是用户程序与
内核交流的标准借口,因此对内核还是有一定依赖的。但是这并不相矛盾,因为只要是一个系
列的内核,基本上是没多少关系的,比如现今的2.6系列,它们会有提供统一的系统调用。
    glibc需要了解内核的系统调用和这些调用相关的一些数据结构。Linux内核做得很好,不需
要有内核的二进制文件,一切都包含在了内核的公用头文件中了。这里说些题外话,如果你够
牛的话,其实完全可以不用glibc,只利用这些头文件就可以写出合适的用户程序的,甚至比利
用glibc的更为优秀。不过如果你的确那么牛,这篇文章也就不适合你了。
    不多说了,下载一个内核源代码到你的source目录吧。最新的是2.6.23.12。
解压缩内核源代码包并进入源代码目录:

    #tar –jvxf linux-2.6.23.12.tar.bz2
    #cd linux-2.6.23.12

安装相关的头文件:

    #make mrproper
    #make headers_check
    #make INSTALL_HDR_PATH=dest header_install
    #cp –rv dest/include/* /toolchain/include
    #cd ../

关于内核操作有什么不了解的,可以使用make help命令获得帮助。
解压缩glibc的源代码包并进入源代码目录:

    #tar –jvxf glibc-2.7.tar.bz2
    #cd glibc-2.7

与gcc一样,还需要单独的目录来创建,建立build目录:

    #mkdir build
    #cd build

由于glibc不再支持i386体系了,因此它的开发者们建议在创建glibc是,最好使用-march=i486编译选
项。的确如此,如果你不指定这个选项,会创建失败。但是毕竟现在i486用的已经很少了,我们
也可以不考虑兼顾,为了进一步提高性能,我建议使用-march=i686编译选项。你可以通过下面的
命令完成这些:

    #echo “CFLAGS += -march=i686” > configparms

接着,为创建glibc做准备工作:

    #configure –prefix=/toolchain –disable-profile –enable-add-ons \
    --enable-kernel=2.6.0 –with-binutils=/toolchain/bin –without-gd \
    --with=headers=/toolchain/include –without-selinux

各选项的含义如下:
    --disable-profile
    忽略掉profiling信息相关的库文件创建,这个时候一般不需要。
    --enable-add-ons
    这个指示glibc使用附加的NPTL(本地POSIX线程库)包作为线程库。
    --enable-kernel=2.6.0
    告诉glibc要支持2.6.x内核。
    --with-binutils=/toolchain/bin
    这个参数并不是必要的,只是为了防止在创建glibc时用错了binutils程序。这里保证使用刚才创建
    好的binutils。
    --without-gd
    保证不生成memusagestat程序,这个程序会产生对你现有系统的依赖。
    --with-headers=/toolchain/include
    这个选项就是告诉glibc,使用刚刚安装的内核都文件创建自己。
    --without-selinux
    不提供SELinux特性的支持,因为toolchain是不需要的。
在这个阶段你要是看到下面的警告你就不用管它,跟你没有任何关系,也不会有什么影响的。

    configure: WARNING:
    *** These auxiliary programs are missing or
    *** incompatible versions: msgfmt
    *** some features will be disabled.
    *** Check the INSTALL file for required versions.

创建软件包:

    #make

在安装glibc的过程中,它会警告缺少/toolchain/etc/ld.so.conf文件。其实没什事,不会有什么影响,只要提
供一个空文件它就闭嘴了:

    #mkdir –v /toolchain/etc
    #touch /toolchain/etc/ld.so.conf

一切顺利就可以安装了:

    #make install

恭喜你,又干了一件了不起的事情,不过别忘了收尾阿,空间有限。

    #cd ../
    #rm –rf build
    #cd ../


(未完,待续......)

[ 本帖最后由 Jagen 于 2008-1-23 23:24 编辑 ]

npcomet 发表于 2008-1-20 01:45:14

:twisted: :twisted: :twisted:鼎力支持

ghosTM55 发表于 2008-1-20 11:07:28

这个不就是LFS了么?呵呵

[ 本帖最后由 ghosTM55 于 2008-1-20 11:09 编辑 ]

nihui 发表于 2008-1-20 11:50:19

3.0 理应基于 2.1 开发的吧~   :shock: :shock:

Jagen 发表于 2008-1-20 12:29:44

原帖由 nihui 于 2008-1-20 11:50 发表 http://www.linuxfans.org/bbs/images/common/back.gif
3.0 理应基于 2.1 开发的吧~   :shock: :shock:


那就继续升级了,为啥还叫3.0?

lanzinc 发表于 2008-1-20 15:02:13

原帖由 ghosTM55 于 2008-1-20 11:07 发表 http://www.linuxfans.org/bbs/images/common/back.gif
这个不就是LFS了么?呵呵


和LFS的不同就在于
LFS:在目标系统编译并直接安装

MGC:在标准系统上编译打包,在目标系统用rpm安装,或用MI利用安装包构建新系统。

该过程MGC要比LFS更复杂一些,涉及打 glibc,gcc这些包,分发的二进制包和标准系统上安装好的文件如何一致的问题。

lanzinc 发表于 2008-1-20 15:19:14

这里用三个lib
一个 Host 的 /lib,工具链的/tools/lib和目标系统的/lib
用错了就麻烦了
呵呵呵,ld会找正确的用。

ghosTM55 发表于 2008-1-20 21:57:28

原帖由 Jagen 于 2008-1-20 12:29 发表 http://www.linuxfans.org/bbs/images/common/back.gif



那就继续升级了,为啥还叫3.0?

对,就是要带来像KDE4那样的震撼,大家一起努力

hover_sky 发表于 2008-1-22 12:44:21

非常好!
坚决支持!:mrgreen:

SCerZZ 发表于 2008-1-23 15:15:58

顶,还好搞了两次lfs,看得懂。这样的话针对3.0,应该要提供大家统一使用的glibc和其它工具链的库版本比较合适吧。

csfrank 发表于 2008-1-25 17:21:59

提供两份资料供大家参考

很激动人心的消息,虽然我很忙没时间参加开发,但是看着这个工具链的制作,有些过于 LFS 化了。
小弟不才,提供两份制作工具链时可能需要用到的参考资料:
Glibc GCC Binutils 安装指南
GCC编译优化指南
建议 ML 就要有 ML 的特点,尽量打造出高效能的工具链。
下面是我在做 LFS 时编译工具链的相关命令,仅供参考[我没有安装C++编译器]:

export LFS=$LFS
export SRC=$LFS/data
export PATH=/www/bin:/bin:/usr/bin
export LC_ALL=C TZ=UTC
export CFLAGS='-DNDEBUG -O3 -fomit-frame-pointer -pipe -fno-bounds-check -freg-struct-return -march=athlon-xp -maccumulate-outgoing-args -fmerge-all-constants -finline-limit=300'
export LDFLAGS='-s -Wl,-O1,-s'
alias make='make -j1' mkdir='mkdir -p' patch='patch -p1 -i' mv='mv -f' cp='cp -pf' rm='rm -fr'

( test ! -f $SRC/tmp.log ) && [ "`pwd`" = "$SRC" ] &&
tar -xf binutils-2.18.tar.bz2 && mkdir binutils-build && cd binutils-build &&
echo 'MAKEINFO = :' >> ../binutils-2.18/Makefile.in &&
CFLAGS="-O2 -fomit-frame-pointer -pipe -march=athlon-xp" LDFLAGS="-s"\
../binutils-2.18/configure --prefix=/www --disable-nls --disable-rpath --disable-multilib --disable-shared --enable-static --disable-64-bit-bfd --disable-cgen-maint --disable-libada --disable-libgcc-math --disable-libgcj --disable-libssp --disable-objc-gc --disable-werror --with-gnu-ld --without-gmp --without-mpfr --without-included-gettext --without-libiconv-prefix --without-libintl-prefix --with-pic &&
make all install tooldir=/www/ && cp ../binutils-2.18/include/libiberty.h /www/include &&
make clean-ld all-ld LIB_PATH=/www/lib CC="gcc -B/www/bin/" tooldir=/www/ && cp ld/ld-new /www/bin/ &&
cd $SRC && rm */ &&
echo '1-binutils-pass1' >> $SRC/tmp.log && sync &&

tar -xf gcc-core-4.2.2.tar.bz2 && mkdir gcc-build && cd gcc-build &&
sed -r -i 's|^LDFLAGS(_FOR_TARGET)? =|& @LDFLAGS@|' ../gcc-4.2.2/Makefile.in &&
sed -i 's/install_to_$(INSTALL_DEST) //' ../gcc-4.2.2/libiberty/Makefile.in &&
sed -i -e's@\./fixinc\.sh@-c true@' -e'/^LIBGCC2_DEBUG_CFLAGS/d' ../gcc-4.2.2/gcc/Makefile.in &&
sed -i '/MULTILIB_OSDIRNAMES/d' ../gcc-4.2.2/gcc/config/i386/t-linux64 &&
CC="gcc -B/www/bin/" CFLAGS="-O2 -fomit-frame-pointer -pipe -march=athlon-xp" LDFLAGS="-s"\
../gcc-4.2.2/configure --prefix=/www --with-local-prefix=/www --enable-languages=c --enable-bootstrap --enable-checking=yes --enable-largefile --disable-nls --disable-rpath --disable-multilib --disable-cpp --enable-shared=libgcc --enable-static=libgcc --disable-libada --disable-libgcj --disable-libgomp --disable-libmudflap --disable-libssp --disable-decimal-float --disable-install-libiberty --enable-linux-futex --enable-threads=posix --enable-tls --disable-symvers --with-arch=athlon-xp --with-long-double-128 --with-gnu-as --with-gnu-ld --with-as=/www/bin/as --with-ld=/www/bin/ld --without-included-gettext --without-libiconv-prefix --without-libintl-prefix --without-gmp --without-mpfr --without-system-libunwind --without-system-zlib --with-pic --without-x &&
make bootstrap4 install LIBCFLAGS="-O2 -fomit-frame-pointer -pipe -march=athlon-xp" BOOT_CFLAGS="-O2 -fomit-frame-pointer -pipe -march=athlon-xp" BOOT_LDFLAGS="-s" &&
ln -sf gcc /www/bin/cc &&
INC=`gcc -print-file-name=include` &&
TOL=`gcc -print-file-name=install-tools` &&
rm$INC/* &&
cp$TOL/include/*   $INC &&
cp$TOL/gsyslimits.h$INC/syslimits.h &&
unset INC TOL &&
cd $SRC && rm */ &&
echo '2-gcc-pass1' >> $SRC/tmp.log && sync &&

tar -xf linux-2.6.23.13.tar.bz2 && cd linux-2.6.23.13 &&
sed -i '/scsi/d' include/Kbuild &&
make distclean && make headers_check ARCH=i386 &&
make headers_install ARCH=i386 INSTALL_HDR_PATH=temp &&
cp -r temp/include/* /www/include/ &&
cd $SRC && rm */ &&
echo '3-kernel-headers' >> $SRC/tmp.log && sync &&

tar -xf glibc-2.6.1.tar.bz2 && mkdir glibc-build && cd glibc-build &&
find .. -name configure | xargs touch &&
LDFLAGS="`echo $LDFLAGS | sed 's/,--hash-style=gnu//'`"\
../glibc-2.6.1/configure --prefix=/www --enable-add-ons=nptl --enable-shared --disable-static --disable-bind-now --disable-bounded --enable-force-install --enable-hidden-plt --enable-kernel=2.6.22 --disable-oldest-abi --enable-omitfp --disable-profile --enable-sanity-checks --enable-stackguard-randomization --disable-static-nss --with-headers=/www/include --with-binutils=/www/bin --without-cvs --with-elf --without-gd --without-gmp --without-selinux --with-fp --with-tls &&
make && ( make -k check 2> $SRC/tmp_glibc.log ; make install ) &&
rm /www/lib/*_g.* &&
cp --remove-destination /www/share/zoneinfo/UTC /www/etc/localtime &&
cd $SRC && rm */ &&
echo '4-glibc' >> $SRC/tmp.log && sync &&

mv /www/bin/{ld-new,ld} &&
gcc -dumpspecs | sed 's@/lib/ld-linux.so.2@/www/lib/ld-linux.so.2@g' > `dirname $(gcc -print-libgcc-file-name)`/specs &&
echo 'main(){}' > dummy.c && cc dummy.c && readelf -l a.out | fgrep '' && rm dummy.c a.out &&
echo '5-Adjusting' >> $SRC/tmp.log && sync &&

tar -xf tcl8.4.16-src.tar.gz && cd tcl8.4.16/unix &&
./configure --prefix=/www --enable-threads --enable-shared --enable-load --enable-gcc --disable-symbols --disable-64bit --disable-64bit-vis --disable-langinfo --disable-corefoundation --disable-dtrace --disable-framework --disable-man-symlinks --disable-man-compression --disable-man-suffix &&
make && make install install-private-headers &&
ln -sf tclsh8.4 /www/bin/tclsh &&
cd $SRC && rm */ && sync &&
tar -xf expect-5.43.0.tar.bz2 && cd expect-5.43 &&
patch $SRC/expect-5.43.0-spawn-2.patch &&
sed -i 's/STTY_BIN=.*/STTY_BIN=stty/g' configure{.in,} &&
./configure --prefix=/www --enable-threads --enable-shared --enable-load --enable-gcc --with-tcl=/www/lib --with-tclinclude=/www/include --with-x=no --disable-symbols &&
make expect && make install SCRIPTS="" &&
cd $SRC && rm */ && sync &&
tar -xf dejagnu-1.4.4.tar.gz && cd dejagnu-1.4.4 &&
./configure --prefix=/www &&
make install &&
cd $SRC && rm */ &&
echo '6-tcl-expect-dejagnu' >> $SRC/tmp.log && sync &&

tar -xf gcc-core-4.2.2.tar.bz2 && tar -xf gcc-testsuite-4.2.2.tar.bz2 && cd gcc-4.2.2 &&
sed -r -i 's|^LDFLAGS(_FOR_TARGET)? =|& @LDFLAGS@|' Makefile.in &&
sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in &&
sed -i -e's@\./fixinc\.sh@-c true@' -e'/^LIBGCC2_DEBUG_CFLAGS/d' gcc/Makefile.in &&
sed -i '/MULTILIB_OSDIRNAMES/d' gcc/config/i386/t-linux64 &&
echo '/* Remove /usr/include from end of include search path.*/
#undef STANDARD_INCLUDE_DIR
#define STANDARD_INCLUDE_DIR 0' | tee -a gcc/config/linux.h gcc/config/i386/linux{,64}.h &&
sed -i 's@/lib/ld.so@/www&@g' gcc/config/i386/gnu.h &&
sed -i 's@/lib/ld-linux.so.2@/www&@g' gcc/config/i386/linux{,64}.h &&
sed -i 's@/lib64/ld-linux-x86-64.so.2@/www&@g' gcc/config/i386/linux64.h &&
# sed -i '/LINK_SPEC/s/ "/&--hash-style=gnu /' gcc/config/i386/linux{,64}.h &&
mkdir ../gcc-build && cd ../gcc-build &&
../gcc-4.2.2/configure --prefix=/www --with-local-prefix=/www --enable-languages=c --enable-bootstrap --enable-checking=yes --enable-largefile --disable-nls --disable-rpath --disable-multilib --disable-cpp --enable-shared=libgcc --enable-static=libgcc --disable-libada --disable-libgcj --disable-libgomp --disable-libmudflap --disable-libssp --disable-decimal-float --disable-install-libiberty --enable-linux-futex --enable-threads=posix --enable-tls --disable-symvers --with-arch=athlon-xp --with-long-double-128 --with-gnu-as --with-gnu-ld --with-as=/www/bin/as --with-ld=/www/bin/ld --without-included-gettext --without-libiconv-prefix --without-libintl-prefix --without-gmp --without-mpfr --without-system-libunwind --without-system-zlib --with-pic --without-x &&
make profiledbootstrap LIBCFLAGS="$CFLAGS" BOOT_CFLAGS="$CFLAGS" BOOT_LDFLAGS="$LDFLAGS" &&
( make -k check | tee $SRC/tmp_gcc.log ; make install ) &&
INC=`gcc -print-file-name=include` &&
TOL=`gcc -print-file-name=install-tools` &&
rm$INC/* &&
cp$TOL/include/*   $INC &&
cp$TOL/gsyslimits.h$INC/syslimits.h &&
unset INC TOL &&
cd $SRC && rm */ && sync &&
echo 'main(){}' > dummy.c && cc dummy.c && readelf -l a.out | fgrep '' && rm dummy.c a.out &&
echo '7-gcc-pass2' >> $SRC/tmp.log && sync &&

tar -xf binutils-2.18.tar.bz2 && mkdir binutils-build && cd binutils-build &&
echo 'MAKEINFO = :' >> ../binutils-2.18/Makefile.in &&
CFLAGS="$CFLAGS -fno-inline-functions" \
../binutils-2.18/configure --prefix=/www --with-lib-path=/www/lib --disable-nls --disable-rpath --disable-multilib --disable-shared --enable-static --disable-64-bit-bfd --disable-cgen-maint --disable-libada --disable-libgcc-math --disable-libgcj --disable-libssp --disable-objc-gc --disable-werror --with-gnu-ld --without-gmp --without-mpfr --without-included-gettext --without-libiconv-prefix --without-libintl-prefix --with-pic &&
make all check install tooldir=/www/ &&
make clean-ld all-ld check-ld LIB_PATH=/lib:/usr/lib tooldir=/www/ && cp ld/ld-new /www/bin/ &&
cp ../binutils-2.18/include/libiberty.h /www/include/ &&
cd $SRC && rm */ &&
echo '8-binutils-pass2' >> $SRC/tmp.log && sync &&

csfrank 发表于 2008-1-25 17:22:28

下面是 chroot 后的命令

------------------下面是 chroot 后的命令---------------------
( test ! -f $SRC/build.log ) && [ "`pwd`" = "$SRC" ] &&
R=/root/linux-headers-2.6.23.13/ &&
tar -xf linux-2.6.23.13.tar.bz2 && cd linux-2.6.23.13 &&
sed -i '/scsi/d' include/Kbuild &&
make distclean && make headers_check ARCH=i386 &&
make headers_install ARCH=i386 INSTALL_HDR_PATH=$R/usr &&
cp -r $R/usr/include /usr/ &&
cd $SRC && rm */ &&
echo '1-kernel-headers' >> $SRC/build.log && sync &&

R=/root/glibc-2.6.1/ && mkdir {,$R}/usr/lib/locale &&
tar -xf glibc-2.6.1.tar.bz2 && cd glibc-2.6.1 &&
sed -i 's|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=/lib/ld-linux.so.2 -o|' scripts/test-installation.pl &&
sed -r -i 's:/bin/(pwd|cat):\1:g' configure{.in,} io/ftwtest-sh stdio-common/{test-popen,xbug,tstscanf}.c &&
sed -i -e's|^rootsbindir =.*|rootsbindir=/usr/bin|' -e's|^sbindir = .*|sbindir=/usr/bin|' Makeconfig &&
sed -i 's|^sbindir=.*|sbindir=/usr/bin|' {,posix/glob/}configure &&
sed -i 's|libc_cv_rootsbindir=.*|libc_cv_rootsbindir=/usr/bin|' sysdeps/unix/sysv/linux/configure &&
find . -name configure | xargs touch &&
mkdir ../glibc-build && cd ../glibc-build &&
../glibc-2.6.1/configure --prefix=/usr --sbindir=/usr/bin --enable-add-ons=nptl --enable-shared --disable-static --disable-bind-now --disable-bounded --enable-force-install --enable-hidden-plt --enable-kernel=2.6.23 --disable-oldest-abi --enable-omitfp --disable-profile --enable-sanity-checks --enable-stackguard-randomization --disable-static-nss --with-headers=/usr/include --with-binutils=/www/bin --without-cvs --with-elf --without-gd --without-gmp --without-selinux --with-fp --with-tls &&
make && ( make -k check 2> $SRC/build_glibc.log ; make install ) &&
make install install_root=$R &&
localedef -i zh_CN -f UTF-8 zh_CN.UTF-8 && cp /usr/lib/locale/* $R/usr/lib/locale/ &&
rm {,$R}/etc/rpc {,$R}/{,usr}/lib/*_g.* {,$R}/usr/libexec/pt_chown {,$R}/usr/share/locale &&
echo 'passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files' | tee {,$R}/etc/nsswitch.conf &&
cp --remove-destination /usr/share/zoneinfo/UTC   /etc/localtime &&
cp --remove-destination /usr/share/zoneinfo/UTC $R/etc/localtime &&
cp /etc/{passwd,group,hosts}$R/etc/ &&
cd $SRC && rm */ &&
echo '2-glibc' >> $SRC/build.log && sync &&

mv /www/bin/{ld-new,ld} &&
gcc -dumpspecs | sed -e'/^\*link:$/{n;s@$@ -L/usr/lib@}' -e's@/www/lib/ld-linux.so.2@/lib/ld-linux.so.2@g' -e'/^\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' -e'/^\*cpp:$/{n;s@$@ -isystem /usr/include@}' > `dirname $(gcc -print-libgcc-file-name)`/specs &&
echo 'main(){}' > dummy.c && cc dummy.c -v -Wl,--verbose &> dummy.log &&
readelf -l a.out | fgrep '' &&
fgrep 'attempt to open /usr/lib/crt1.o succeeded' dummy.log &&
fgrep 'attempt to open /usr/lib/crti.o succeeded' dummy.log &&
fgrep 'attempt to open /usr/lib/crtn.o succeeded' dummy.log &&
fgrep '#include <...> search starts here:
/usr/include
/www/include' dummy.log &&
# fgrep 'SEARCH_DIR("/www/i686-pc-linux-gnu/lib"); SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib");' dummy.log &&
fgrep 'attempt to open /lib/libc.so.6 succeeded' dummy.log &&
fgrep 'found ld-linux.so.2 at /lib/ld-linux.so.2' dummy.log &&
rm dummy.c a.out dummy.log &&
echo '3-adjusting' >> $SRC/build.log && sync &&

R=/root/binutils-2.18/ &&
tar -xf binutils-2.18.tar.bz2 && mkdir binutils-build && cd binutils-build &&
echo 'MAKEINFO = :' >> ../binutils-2.18/Makefile.in &&
CFLAGS="$CFLAGS -fno-inline-functions" \
../binutils-2.18/configure --prefix=/usr --sbindir=/usr/bin --with-lib-path=/lib:/usr/lib --disable-nls --disable-rpath --disable-multilib --enable-shared --disable-static --disable-64-bit-bfd --disable-cgen-maint --disable-libada --disable-libgcc-math --disable-libgcj --disable-libssp --disable-objc-gc --disable-werror --with-gnu-ld --without-gmp --without-mpfr --without-included-gettext --without-libiconv-prefix --without-libintl-prefix --with-pic &&
make all check install tooldir=/usr/&& cp ../binutils-2.18/include/libiberty.h   /usr/include/ &&
make install tooldir=/usr/ DESTDIR=$R && cp ../binutils-2.18/include/libiberty.h $R/usr/include/ &&
cd $SRC && rm */ &&
echo '5-binutils' >> $SRC/build.log && sync &&

R=/root/gcc-4.2.2/ &&
tar -xf gcc-core-4.2.2.tar.bz2 && tar -xf gcc-testsuite-4.2.2.tar.bz2 && cd gcc-4.2.2 &&
sed -r -i 's|^LDFLAGS(_FOR_TARGET)? =|& @LDFLAGS@|' Makefile.in &&
sed -i -e's@\./fixinc\.sh@-c true@' -e'/^LIBGCC2_DEBUG_CFLAGS/d' gcc/Makefile.in &&
sed -i '/MULTILIB_OSDIRNAMES/d' gcc/config/i386/t-linux64 &&
sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in &&
sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in &&
# sed -i '/LINK_SPEC/s/ "/&--hash-style=gnu /' gcc/config/i386/linux{,64}.h &&
mkdir ../gcc-build && cd ../gcc-build &&
../gcc-4.2.2/configure --prefix=/usr --sbindir=/usr/bin --with-local-prefix=/usr/local --enable-languages=c --enable-bootstrap --enable-checking=yes --enable-largefile --disable-nls --disable-rpath --disable-multilib --disable-cpp --enable-shared=libgcc --disable-static --disable-libada --disable-libgcj --disable-libgomp --disable-libmudflap --disable-libssp --disable-decimal-float --disable-install-libiberty --enable-linux-futex --enable-threads=posix --enable-tls --disable-symvers --with-arch=athlon-xp --with-long-double-128 --with-gnu-as --with-gnu-ld --with-as=/usr/bin/as --with-ld=/usr/bin/ld --without-included-gettext --without-libiconv-prefix --without-libintl-prefix --without-gmp --without-mpfr --without-system-libunwind --without-system-zlib --with-pic --without-x &&
make profiledbootstrap LIBCFLAGS="$CFLAGS" BOOT_CFLAGS="$CFLAGS" BOOT_LDFLAGS="$LDFLAGS" &&
( make -k check | tee $SRC/build_gcc.log ; make install ) &&
make install DESTDIR=$R &&
ln -sf gcc   /usr/bin/cc &&
ln -sf gcc $R/usr/bin/cc &&
INC=`gcc -print-file-name=include` &&
TOL=`gcc -print-file-name=install-tools` &&
rm{,$R}/$INC/* &&
cp$TOL/include/*   $INC &&
cp$TOL/include/*$R/$INC &&
cp$TOL/gsyslimits.h   $INC/syslimits.h &&
cp$TOL/gsyslimits.h$R/$INC/syslimits.h &&
unset INC TOL &&
cd $SRC && rm */ && sync &&
echo 'main(){}' > dummy.c && cc dummy.c -v -Wl,--verbose &> dummy.log &&
readelf -l a.out | fgrep '' &&
fgrep 'attempt to open /usr/lib/gcc/i686-pc-linux-gnu/4.2.2/../../../crt1.o succeeded' dummy.log &&
fgrep 'attempt to open /usr/lib/gcc/i686-pc-linux-gnu/4.2.2/../../../crti.o succeeded' dummy.log &&
fgrep 'attempt to open /usr/lib/gcc/i686-pc-linux-gnu/4.2.2/../../../crtn.o succeeded' dummy.log &&
fgrep '#include <...> search starts here:
/usr/lib/gcc/i686-pc-linux-gnu/4.2.2/include
/usr/include
End of search list.' dummy.log &&
fgrep 'SEARCH_DIR("/usr/i686-pc-linux-gnu/lib"); SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib");' dummy.log &&
fgrep 'attempt to open /lib/libc.so.6 succeeded' dummy.log &&
fgrep 'found ld-linux.so.2 at /lib/ld-linux.so.2' dummy.log &&
rm dummy.c a.out dummy.log &&
echo '6-gcc' >> $SRC/build.log && sync &&

ghosTM55 发表于 2008-1-26 10:28:00

这是csfrank大哥写的LFS脚本吧?

学习了

haulm 发表于 2008-1-26 17:15:30

有点复杂,不过内容的确就是LFS工具链原文的翻译,有些错误的地方是标点符号并有少量的漏填指令。具体内容可以参考

http://www.linuxfromscratch.org/lfs/view/development/chapter05/chapter05.html

http://www.linuxfromscratch.org/lfs/view/development/part3.html

http://www.linuxfromscratch.org/lfs/view/development/index.html

[ 本帖最后由 haulm 于 2008-1-26 17:25 编辑 ]

Jagen 发表于 2008-1-26 21:25:57

原帖由 haulm 于 2008-1-26 17:15 发表 http://www.linuxfans.org/bbs/images/common/back.gif
有点复杂,不过内容的确就是LFS工具链原文的翻译,有些错误的地方是标点符号并有少量的漏填指令。具体内容可以参考

http://www.linuxfromscratch.org/lfs/view/development/chapter05/chapter05.html

ht ...

兄弟,发现错误的地方,标注一下好吗?
页: [1] 2 3
查看完整版本: Magic Linux开发入门指南(一)