中国Linux公社论坛's Archiver

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

Magic Linux开发入门指南(一)

[font=宋体][size=12pt]    制作一个Linux发布难吗?[/size][/font]
[font=宋体][size=12pt]    很难。[/size][/font]
[font=宋体][size=12pt]    制作一个Linux发布版需要很高深的技术吗?[/size][/font]
[font=宋体][size=12pt]    你能行。[/size][/font]
[font=Times New Roman][size=3][/size][/font]
[font=宋体][size=12pt]    好多人很想参与Magic Linux的开发,但多数不知从何入手。[/size][/font]
[font=宋体][size=12pt]    其实很简单,你只需要一台供你支配的386以上配置且能够上网的电脑,[/size][/font]
[font=宋体][size=12pt]以及一个能够工作在其上的gcc环境。[/size][/font]
[font=宋体][size=12pt]    对,这就够了,其他的软件都是在帮助你更快的、更简便的完成这个工[/size][/font]
[font=宋体][size=12pt]作。因为Linux源自于网络,发展于网络,[/size][/font][font=宋体][size=12pt]能够上网才能得到Linux;Linux[/size][/font]
[font=宋体][size=12pt]自身及在其之上运行的大多数软件都是以源代码方式提供,且非gcc不能完成[/size][/font]
[font=宋体][size=12pt]内核的编译。拥有了这些,你就可以开始将这些源代码转化为可运行的内核、[/size][/font]
[font=宋体][size=12pt]Shell和一些应用软件,一点一点的就构成了一个完整的可用的Linux系统。[/size][/font]
[font=宋体][size=12pt]    本文就是讲述如何开始这些工作的。我会假定你对Linux有一定的了解,[/size][/font]
[font=宋体][size=12pt]使用过如:cp、mv、rm等常用命令,曾经成功的在某个Linux系统中安装过某个[/size][/font]
[font=宋体][size=12pt]以源代码形式发布的软件,有一些C/C++或其他语言的经验。[/size][/font]
[font=宋体][size=12pt]    另外,我所提到的gcc环境并不是单指gcc本身,而是一些与gcc相交织[/size][/font][font=宋体][size=12pt]的[/size][/font]
[font=宋体][size=12pt]软件集合,它们共同工作,完成从源代码到可执行程序的转换过程,这个过[/size][/font][font=宋体][size=12pt]程[/size][/font]
[font=宋体][size=12pt]一般被称之为创建。[/size][/font]
[font=宋体][size=12pt][/size][/font]
[font=宋体][size=6]第一章 工具链的制作[/size][/font][size=12pt]
[/size]
[font=宋体][size=12pt]    在正式开始前,我还要让你了解一个重要的知识,那就是编译器、连接器[/size][/font]
[font=宋体][size=12pt]和程序库他们三者之间的关系,如果你已经非常了解了,可以略过这些内容。[/size][/font]
[font=宋体][size=12pt]编译器只是将源代码翻译成对应的机器代码,但是这个时候这些代码是不能执[/size][/font]
[font=宋体][size=12pt]行的,因为既没有排列好执行顺序也没有指定从哪里开始;程序库实现了一些[/size][/font]
[font=宋体][size=12pt]程序必要的行为,比如你要输出一些内容到屏幕或从键盘获得输入等;连接器[/size][/font]
[font=宋体][size=12pt]将编译器产生的机器代码进行排序并告诉计算机(严格来讲是操作系统)从什么[/size][/font]
[font=宋体][size=12pt]地方开始执行,当程序需要输出一些内容到屏幕或从键盘获得输入时,请求程[/size][/font]
[font=宋体][size=12pt]序库完成这些事情。虽然这些说法显得很不专业,但是足以帮助你理解它们三[/size][/font]
[font=宋体][size=12pt]者之间的关系了。如果要获得更为专业、详细的知识请阅读相关专业书籍。[/size][/font]
[font=宋体][size=12pt]    一个能够正常工作的gcc环境,需要三个源代码包的支持:[b]binutils[/b]、[/size][/font]
[font=宋体][size=12pt][b]gcc[/b][/size][/font][font=宋体][size=12pt]和[b]glibc[/b],它们分别提供了连接器、编译器和程序库。其实他们并不仅仅提[/size][/font]
[font=宋体][size=12pt]供了[/size][/font][font=宋体][size=12pt]这些内容:[/size][/font]
[b][font=宋体][size=12pt]    binutils[/size][/font][/b][font=宋体][size=12pt]是一个二进制工具集合,包含了汇编器、反汇编器、连接器、[/size][/font]
[font=宋体][size=12pt]elf[/size][/font][font=宋体][size=12pt]可执行文件分析器等重要工具,这些工具在进行Linux各种应用的开发时,[/size][/font]
[font=宋体][size=12pt]发挥[/size][/font][font=宋体][size=12pt]着巨大的作用。你可以在/usr/bin目录中找到他们。[/size][/font]
[b][font=宋体][size=12pt]    gcc[/size][/font][/b][font=宋体][size=12pt]是一个编译器集合,包含了C、C++、Objective-C、Fortran、Java和[/size][/font]
[font=宋体][size=12pt]Ada语[/size][/font][font=宋体][size=12pt]言,同时为这些语言提供了一些标准库,如:libstdc++、libgcj,……。 [/size][/font]
[font=宋体][size=12pt]gcc的C是Linux的标准编译器,linux内核完全依赖于gcc,其他编译器不能编[/size][/font][font=宋体][size=12pt]译[/size][/font]
[font=宋体][size=12pt]linux内核。由于ABI(Application Binary Interface)的不兼容,其他编译器[/size][/font]
[font=宋体][size=12pt]也[/size][/font][font=宋体][size=12pt]不适合Linux上的大多数软件的编译,尤其那些使用C++作为开发语言的软件系[/size][/font]
[font=宋体][size=12pt]统。[/size][/font][font=宋体][size=12pt]目前Intel C/C++编译器开始兼容gcc的ABI,因此现在可以采用Intel C/C++[/size][/font]
[font=宋体][size=12pt]编译[/size][/font][font=宋体][size=12pt]器创建Linux上使用C/C++开发的软件系统,但内核不行。gcc被安装在[/size][/font]
[font=宋体][size=12pt]/usr/bin、[/size][/font][font=宋体][size=12pt]/usr/lib和/usr/include目录中。[/size][/font]
[b][font=宋体][size=12pt]    glibc[/size][/font][/b][font=宋体][size=12pt]是提供系统调用和基本函数的C库,比如open,malloc,printf等等,[/size][/font]
[font=宋体][size=12pt]所有动态连接的程序都要用到它。它是用户程序与内核交流的标准接口。[/size][/font]
[font=宋体][size=12pt]    这三个包在一起相互作用,来完成Linux的所有创建任务。除了glibc是自包[/size][/font]
[font=宋体][size=12pt]含[/size][/font][font=宋体][size=12pt](自己依赖于自己)的外,其他两个都要依赖于glibc,同时glibc会与具体的内[/size][/font]
[font=宋体][size=12pt]核版本有一定的依赖性,但这并不是绝对的。注意,他们都是用gcc编译,并用[/size][/font]
[font=宋体][size=12pt]binutils的连接器进行连接的。这里就比较有趣了,是先有鸡还是先有蛋呢?计[/size][/font]
[font=宋体][size=12pt]算机的发展史咱们就不必讨论了,在本章会详细介绍如何来让他们的代码执行起[/size][/font]
[font=宋体][size=12pt]来。但他们不是我们要的全部。[/size][/font]
[font=宋体][size=12pt][/size][/font]
[font=宋体][size=12pt]    首先,你应该保证你有可用的gcc环境,能够用它让你的源代码变成可执行程[/size][/font]
[font=宋体][size=12pt]序。往往这需要你的计算机运行了某个版本的Linux发布。当然Windows也行,不[/size][/font]
[font=宋体][size=12pt]过会比较麻烦,我不建议你这么做,我也不会在这里讨论该怎么做。你也不要指[/size][/font]
[font=宋体][size=12pt]望你现在的这个gcc环境可以直接创建Magic Linux的所有,最后你得到的还是属[/size][/font]
[font=宋体][size=12pt]于你现在使用的这个发布。因为你现在的gcc创建产生后的程序,还是依赖于你现[/size][/font]
[font=宋体][size=12pt]有Linux发布版的glibc的。如果你说你现在就创建一个glibc不就行了吗?不信你[/size][/font]
[font=宋体][size=12pt]可以试试,当你安装完后,看看你的系统还能工作不?言归正传,你现在急需的[/size][/font]
[font=宋体][size=12pt]是[/size][/font][font=宋体][size=12pt]能够帮助你产生MagicLinux的gcc。[/size][/font]
[font=宋体][size=12pt][/size][/font]
[size=5][font=Arial]1.[/font][font=黑体]准备环境[/font][/size]
[font=宋体][size=12pt]    最好能在你的硬盘上划分出一个独立的分区,1G大小就够了。不过这个你都嫌[/size][/font]
[font=宋体][size=12pt]麻烦的话,你有1G以上的自由空间也行。现在我假设你划分了一个独立的分区。[/size][/font]
[font=宋体][size=12pt]    来吧,创建/mnt/ml目录,并将你的新分区挂接到这上面(如果不了解挂接的话,[/size][/font]
[font=宋体][size=12pt]先找找资料,google一下mount)。[/size][/font]
[font=宋体][size=12pt][/size][/font]
[size=2][font=宋体][color=#4f81bd][b]#mkdir /mnt/ml[/b][/color][/font]
[/size][font=宋体][b][size=2][color=#4f81bd]    #mount /dev/hda6 /mnt/ml [/color][/size][/b][/font][font=宋体][size=12pt]([/size][/font][font=宋体][size=12pt]我假设你的新分区设备名为hda6)[/size][/font]
[font=宋体][size=12pt][/size][/font]
[font=宋体][size=12pt]cd[/size][/font][font=宋体][size=12pt]到/mnt/ml目录并创建toolchain目录。[/size][/font]
[font=宋体][size=12pt][/size][/font]
[size=2][font=宋体][color=#4f81bd][b]    #cd /mnt/ml[/b][/color][/font]
[font=宋体][color=#4f81bd][b]    #mkdir toolchain[/b][/color][/font]
[b][font=Times New Roman][size=3][color=#4f81bd][/color][/size][/font][/b][/size]
[font=宋体][size=12pt]在你的根目录创建一个连接到toolchain上(如果不了解,google一下ln)。[/size][/font]
[font=宋体][size=12pt][/size][/font]
[size=2][font=宋体][b][color=#4f81bd]    #ln -sv /mnt/ml/toolchain /toolchain[/color][/b][/font]
[font=宋体][size=12pt][/size][/font]
[/size][font=宋体][size=12pt]创建sources目录。[/size][/font]
[font=宋体][size=12pt][/size][/font]
[size=2][font=宋体][b][color=#4f81bd]    #mkdir sources[/color][/b][/font]
[font=宋体][size=12pt][/size][/font]
[/size][font=宋体][size=12pt]将binutils、gcc和glibc等的源代码复制到sources目录中。你可以在网络上找到它们,[/size][/font]
[font=宋体][size=12pt]google一下就行了。binutils的最新本版是2.18,源代码包可能是这样的文件名:[/size][/font]
[font=宋体][size=12pt]binutils-2.18.tar.bz2;gcc的最新本版是4.2.2,源代码包可能是这样的文件名:[/size][/font]
[font=宋体][size=12pt]gcc-4.2.2.tar.bz2;glibc的最新版本是2.7,源代码包可能是这样的文件名:[/size][/font]
[font=宋体][size=12pt]glibc-2.7.tar.bz2。[/size][/font]
[font=宋体][size=12pt]修改PATH环境变量。[/size][/font]
[font=宋体][size=12pt][/size][/font]
[size=2][font=宋体][b][color=#4f81bd]    #export PATH=/toolchain/bin:$PATH[/color][/b][/font]
[/size][font=宋体][size=12pt][/size][/font]
[font=宋体][size=12pt]PATH[/size][/font][font=宋体][size=12pt]环境变量指定了shell命令的默认搜索路径。我们修改PATH环境变量使得在你的gcc[/size][/font]
[font=宋体][size=12pt]可用时,默认执行的是它,而不是系统自带的。[/size][/font]
[font=宋体][size=12pt]    环境已经准备好了,我们开始吧。[/size][/font]
[font=宋体][size=12pt][/size][/font]
[size=5][font=Arial]2.[/font][font=黑体]创建新的[/font][font=Arial]gcc[/font][font=黑体]环境[/font][/size]
[font=宋体]    [size=12pt]为了创建完全独立于你现有系统的gcc环境,我们要创建两次binutils和gcc。他们创[/size][/font]
[font=宋体][size=12pt]建的次序是很重要的。我们现在进行第一次创建。进入sources目录。[/size][/font]
[font=宋体][size=12pt][/size][/font]
[font=宋体][b][size=2][color=#4f81bd]    #cd sources[/color][/size][/b][/font]
[font=宋体][size=12pt][/size][/font]
[b][size=4][font=Cambria]2.1[/font][font=宋体]创建[/font][font=Cambria]binutils[/font][/size][/b]
[font=宋体][size=12pt]    首先创建[/size][/font][size=12pt][font=Times New Roman]binutils[/font][/size][font=宋体][size=12pt],是因为在创建[/size][/font][size=12pt][font=Times New Roman]gcc[/font][/size][font=宋体][size=12pt]和[/size][/font][size=12pt][font=Times New Roman]glibc[/font][/size][font=宋体][size=12pt]时,它们会检测连接器和汇编器,以便决定[/size][/font]
[font=宋体][size=12pt]它们能够开启那些特性。整个过程大概需要[/size][/font][size=12pt][font=Times New Roman]5[/font][/size][font=宋体][size=12pt]分钟(根据你机器的处理能力会有很大的不[/size][/font]
[font=宋体][size=12pt]同),占用[/size][/font][size=12pt][font=Times New Roman]200MB[/font][/size][font=宋体][size=12pt]左右的磁盘空间。[/size][/font][size=12pt][/size]
[font=宋体][size=12pt]    解压缩源代码包,并进入解压后的目录:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    #tar -jvxf binutils-2.18.tar.gz[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    #cd binutils-2.18[/color][/b][/font][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]由于[/size][/font][size=12pt][font=Times New Roman]binutils[/font][/size][font=宋体][size=12pt]在某些时候会有一点小问题,要修复它,需要下在一个补丁,对应[/size][/font][size=12pt][font=Times New Roman]2.18[/font][/size][font=宋体][size=12pt]版本的[/size][/font]
[font=宋体][size=12pt]补丁是:[/size][/font][size=12pt][font=Times New Roman]binutils-2.18-configure-1.patch[/font][/size][font=宋体][size=12pt]。[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][b][size=2][color=#4f81bd]    #patch –Np1 -i ../binutils-2.18-configure-1.patch[/color][/size][/b][/font]
[size=12pt][font=Times New Roman][/font][/size]
[size=12pt][font=Times New Roman]binutils[/font][/size][font=宋体][size=12pt]的文档说应该在一个独立的目录中创建[/size][/font][size=12pt][font=Times New Roman]binutils[/font][/size][font=宋体][size=12pt]。那就创建一个[/size][/font][size=12pt][font=Times New Roman]build[/font][/size][font=宋体][size=12pt]目录。[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    #mkdir build[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    #cd build[/color][/b][/font][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]现在为创建[/size][/font][size=12pt][font=Times New Roman]binutils[/font][/size][font=宋体][size=12pt]做准备工作:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    #CC=”gcc -B/usr/bin/”../configure \[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    --prefix=/toolchain --disable-nls --disable-werror[/color][/b][/font]
[/size][size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]各选项的含义是:[/size][/font][size=12pt][/size]
[b][font=宋体][size=12pt][i]    CC=”gcc -B/usr/bin/”[/i][/size][/font][/b]
[font=宋体][size=12pt]告诉gcc使用你当前操作系统/usr/bin目录下的连接器。这个对于某些你使用的Linux[/size][/font]
[font=宋体][size=12pt]    发布是很重要的,因为新创建的连接器ld可能与它所提供的gcc不兼容。[/size][/font]
[b][font=宋体][size=12pt][i]    --prefix=/toolchain[/i][/size][/font][/b]
[font=宋体][size=12pt]    这个参数告诉[/size][/font][size=12pt][font=Times New Roman]configure[/font][/size][font=宋体][size=12pt]脚本,把[/size][/font][size=12pt][font=Times New Roman]binutils[/font][/size][font=宋体][size=12pt]软件包中的程序安装到[/size][/font][size=12pt][font=Times New Roman]/toolchina[/font][/size][font=宋体][size=12pt]目录中,也就是[/size][/font]
[size=3][font=宋体]    [/font][size=12pt][font=Times New Roman]/mnt/ml/toolchain[/font][/size][/size][font=宋体][size=12pt]。[/size][/font]
[size=3][font=宋体]    [/font][b][size=12pt][font=Times New Roman]--disable-nls[/font][/size][/b][/size]
[font=宋体][size=12pt]    这个参数禁止了国际化(通常简称[/size][/font][size=12pt][font=Times New Roman]i18n[/font][/size][font=宋体][size=12pt])。此时根本不需要国际化支持。[/size][/font]
[size=3][font=宋体]    [/font][b][size=12pt][font=Times New Roman]--disable-werror[/font][/size][/b][/size]
[font=宋体][size=12pt]    这个参数可以防止由于你的系统提供的[/size][/font][size=12pt][font=Times New Roman]gcc[/font][/size][font=宋体][size=12pt]在产生警告事件时停止创建过程。[/size][/font][size=12pt][/size]
[font=宋体][size=12pt]准备好了,我们可以创建了:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=2][color=#4f81bd][b]    #make[/b][/color][/size][/font]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]创建完成后,安装:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][b][color=#4f81bd]    #make install[/color][/b][/font]
[/size][size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]别着急,还没完事。还得调整一下:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    #make –C ld clean[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    #make –C ld LIB_PATH=/toolchain/lib[/color][/b][/font][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=12pt][font=Times New Roman]make[/font][/size][font=宋体][size=12pt]参数的含义是:[/size][/font]
[size=3][font=宋体]    [/font][size=12pt][font=Times New Roman][b]-C ld clean[/b][/font][/size][/size]
[font=宋体][size=12pt]    告诉[/size][/font][size=12pt][font=Times New Roman]make[/font][/size][font=宋体][size=12pt],删除所有子目录[/size][/font][size=12pt][font=Times New Roman]ld[/font][/size][font=宋体][size=12pt]中编译生成的文件。[/size][/font]
[size=3][font=宋体]    [/font][size=12pt][font=Times New Roman][b]-C ld LIB_PATH=/toolchain/lib[/b][/font][/size][/size]
[font=宋体][size=12pt]    这个选项重新编译[/size][/font][size=12pt][font=Times New Roman]ld[/font][/size][font=宋体][size=12pt]子目录中的所有文件。[/size][/font][size=12pt][font=Times New Roman]LIB_PATH[/font][/size][font=宋体][size=12pt]是[/size][/font][size=12pt][font=Times New Roman]Makefile[/font][/size][font=宋体][size=12pt]的一个变量,[/size][/font]
[font=宋体][size=12pt]    在命令行里制定他,可以覆盖默认值,并让它指向[/size][/font][size=12pt][font=Times New Roman]/toolchain/lib[/font][/size][font=宋体][size=12pt]目录。这个变量[/size][/font]
[font=宋体][size=12pt]    的值指定了连接器的缺省库搜索路径。[/size][/font][size=12pt][/size]
[font=宋体][size=12pt]手工将新的程序复制到[/size][/font][size=12pt][font=Times New Roman]/toolchain/bin[/font][/size][font=宋体][size=12pt]目录:[/size][/font]

[size=3][font=宋体]    [/font][/size][size=12pt][font=Times New Roman][size=2][color=#4f81bd][b]#cp –v ld/ld-new /toolchain/bin[/b][/color][/size][/font][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]好了,[/size][/font][size=12pt][font=Times New Roman]binutils[/font][/size][font=宋体][size=12pt]创建完成了,你现在可以删除[/size][/font][size=12pt][font=Times New Roman]build[/font][/size][font=宋体][size=12pt]目录了。但是不要删除[/size][/font][size=12pt][font=Times New Roman]binutils-2.18[/font][/size][font=宋体][size=12pt]目[/size][/font]
[font=宋体][size=12pt]录,因为还要编译一次呢。退回到[/size][/font][size=12pt][font=Times New Roman]sources[/font][/size][font=宋体][size=12pt]目录,准备[/size][/font][size=12pt][font=Times New Roman]gcc[/font][/size][font=宋体][size=12pt]的创建工作。[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[b][size=2][font=宋体][color=#4f81bd]    #cd ../[/color][/font]
[font=宋体][color=#4f81bd]    #rm –rf build[/color][/font]
[font=宋体][color=#4f81bd]    #cd ../[/color][/font][/size][/b]
[size=12pt][font=Times New Roman][/font][/size]
[size=4][b][font=Cambria]2.2 [/font][font=宋体]创建[/font][font=Cambria]gcc[/font][/b]
[/size][font=宋体][size=12pt]    连接器准备好了,但我们这次先不使用它,没有这个必要,因为我们还需要再次[/size][/font]
[font=宋体][size=12pt]创建[/size][/font][size=12pt][font=Times New Roman]gcc[/font][/size][font=宋体][size=12pt]的,那时再用也不迟。这个过程大概会花费你[/size][/font][size=12pt][font=Times New Roman]50[/font][/size][font=宋体][size=12pt]分钟的时间和[/size][/font][size=12pt][font=Times New Roman]650MB[/font][/size][font=宋体][size=12pt]的磁盘空[/size][/font]
[font=宋体][size=12pt]间。[/size][/font][size=12pt][/size]
[font=宋体][size=12pt]    解压缩[/size][/font][size=12pt][font=Times New Roman]gcc[/font][/size][font=宋体][size=12pt]的源代码包并进入源代码目录。[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    #tar –jvxf gcc-4.2.2.tar.bz2[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    #cd gcc-4.2.2[/color][/b][/font][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=12pt][font=Times New Roman]gcc[/font][/size][font=宋体][size=12pt]与[/size][/font][size=12pt][font=Times New Roman]binutils[/font][/size][font=宋体][size=12pt]一样,建议你在一个独立的目录中创建它。创建[/size][/font][size=12pt][font=Times New Roman]build[/font][/size][font=宋体][size=12pt]目录。[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    #mkdir build[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    #cd build[/color][/b][/font][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]为创建[/size][/font][size=12pt][font=Times New Roman]gcc[/font][/size][font=宋体][size=12pt]做准备。[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    #../configure –prefix=/toolchain –with-local-prefix=/toolchain \[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    --disable-nls –enable-shared –enable-languages=c[/color][/b][/font][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]各选项的含义是:[/size][/font][size=12pt][/size]
[b][font=宋体][size=12pt][i]    CC=”gcc -B/usr/bin/”[/i][/size][/font][/b]
[font=宋体][size=12pt]    告诉gcc使用你当前操作系统/usr/bin目录下的连接器。也就是不使用你刚创建完[/size][/font]
[font=宋体][size=12pt]    的[/size][/font][font=宋体][size=12pt]那个连接器ld。这也是为了避免一些麻烦,可以参考创建binutils时对该选项的[/size][/font]
[font=宋体][size=12pt]    说明。[/size][/font]
[b][font=宋体][size=12pt]    --with-local-prefix=/toolchain[/size][/font][/b]
[font=宋体][size=12pt]    默认情况下,[/size][/font][size=12pt][font=Times New Roman]gcc[/font][/size][font=宋体][size=12pt]会搜索两个[/size][/font][size=12pt][font=Times New Roman]include[/font][/size][font=宋体][size=12pt]目录,一个是其安装目录下的[/size][/font][size=12pt][font=Times New Roman]include[/font][/size][font=宋体][size=12pt],这里是[/size][/font]
[size=3][font=宋体]    [/font][size=12pt][font=Times New Roman]/toolchian/include[/font][/size][/size][font=宋体][size=12pt],另外一个是[/size][/font][size=12pt][font=Times New Roman]/usr/local/include[/font][/size][font=宋体][size=12pt]。这个选项就是将[/size][/font][size=12pt][font=Times New Roman]/usr/local/include[/font][/size][font=宋体][size=12pt]这个默[/size][/font]
[font=宋体][size=12pt]    认搜索目录删除,而还是指向[/size][/font][size=12pt][font=Times New Roman]/toolchain/include[/font][/size][font=宋体][size=12pt]。[/size][/font][size=12pt][/size]
[b][font=宋体][size=12pt]    --enable-shared[/size][/font][/b]
[font=宋体][size=12pt]    这个选项是为了创建出[/size][/font][size=12pt][font=Times New Roman]libgcc_s.so.1[/font][/size][font=宋体][size=12pt]和[/size][/font][size=12pt][font=Times New Roman]libgcc_eh.a[/font][/size][font=宋体][size=12pt]文件,因为下一个要创建的[/size][/font][size=12pt][font=Times New Roman]glibc[/font][/size][font=宋体][size=12pt]需要[/size][/font]
[size=3][font=宋体]    [/font][size=12pt][font=Times New Roman]libgcc_eh.a[/font][/size][/size][font=宋体][size=12pt],要是没有它就不会产生正确的结果。[/size][/font][size=12pt][/size]
[b][font=宋体][size=12pt]    --enable-languages=c[/size][/font][/b]
[font=宋体][size=12pt]    因为[/size][/font][size=12pt][font=Times New Roman]gcc[/font][/size][font=宋体][size=12pt]是一个编译器集合,这个选项指定要创建何种语言的编译器。此时只需要[/size][/font][size=12pt][font=Times New Roman]C[/font][/size][font=宋体][size=12pt],[/size][/font]
[font=宋体][size=12pt]    那就没什么可说的了。[/size][/font][size=12pt][/size]
[font=宋体][size=12pt]准备好了,我们可以开始创建了:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][b][size=2][color=#4f81bd]    #make[/color][/size][/b][/font]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]创建完成,安装:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][b][color=#4f81bd]    #make install[/color][/b][/font]
[/size][size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]最后你还应该创建一个符号连接[/size][/font][size=12pt][font=Times New Roman]cc[/font][/size][font=宋体][size=12pt]到这个新的[/size][/font][size=12pt][font=Times New Roman]gcc[/font][/size][font=宋体][size=12pt],因为好多时候会用[/size][/font][size=12pt][font=Times New Roman]cc[/font][/size][font=宋体][size=12pt]而不是[/size][/font][size=12pt][font=Times New Roman]gcc[/font][/size][font=宋体][size=12pt],这是为[/size][/font]
[font=宋体][size=12pt]了与[/size][/font][size=12pt][font=Times New Roman]Unix[/font][/size][font=宋体][size=12pt]平台保持一致,便于程序的移植。[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][b][size=2][color=#4f81bd]    #ln –vs gcc /toolchain/bin/cc[/color][/size][/b][/font]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]好了,[/size][/font][size=12pt][font=Times New Roman]gcc[/font][/size][font=宋体][size=12pt]创建完成了,接下来的创建过程会自动使用这个[/size][/font][size=12pt][font=Times New Roman]gcc[/font][/size][font=宋体][size=12pt]的,因为你修改了[/size][/font][size=12pt][font=Times New Roman]PATH[/font][/size][font=宋体][size=12pt]环境变[/size][/font]
[font=宋体][size=12pt]量。做些首尾工作,要不然你的磁盘可能吃紧了。[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    #cd ../[/b][/color][/font]
[font=宋体][color=#4f81bd][b]    #rm –rf build[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    #cd ../[/color][/b][/font][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=4][b][font=Cambria]2.3[/font][font=宋体]创建[/font][font=Cambria]glibc[/font][/b]
[/size][font=宋体][size=12pt]    前面我说过,[/size][/font][size=12pt][font=Times New Roman]glibc[/font][/size][font=宋体][size=12pt]是自包含的,不会依赖于那个软件包。但是我也说过,它是用户程序与[/size][/font]
[font=宋体][size=12pt]内核交流的标准借口,因此对内核还是有一定依赖的。但是这并不相矛盾,因为只要是一个系[/size][/font]
[font=宋体][size=12pt]列的内核,基本上是没多少关系的,比如现今的[/size][/font][size=12pt][font=Times New Roman]2.6[/font][/size][font=宋体][size=12pt]系列,它们会有提供统一的系统调用。[/size][/font]
[size=3][font=宋体]    [/font][size=12pt][font=Times New Roman]glibc[/font][/size][/size][font=宋体][size=12pt]需要了解内核的系统调用和这些调用相关的一些数据结构。[/size][/font][size=12pt][font=Times New Roman]Linux[/font][/size][font=宋体][size=12pt]内核做得很好,不需[/size][/font]
[font=宋体][size=12pt]要有内核的二进制文件,一切都包含在了内核的公用头文件中了。这里说些题外话,如果你够[/size][/font]
[font=宋体][size=12pt]牛的话,其实完全可以不用[/size][/font][size=12pt][font=Times New Roman]glibc[/font][/size][font=宋体][size=12pt],只利用这些头文件就可以写出合适的用户程序的,甚至比利[/size][/font]
[font=宋体][size=12pt]用[/size][/font][size=12pt][font=Times New Roman]glibc[/font][/size][font=宋体][size=12pt]的更为优秀。不过如果你的确那么牛,这篇文章也就不适合你了。[/size][/font]
[font=宋体][size=12pt]    不多说了,下载一个内核源代码到你的[/size][/font][size=12pt][font=Times New Roman]source[/font][/size][font=宋体][size=12pt]目录吧。最新的是[/size][/font][size=12pt][font=Times New Roman]2.6.23.12[/font][/size][font=宋体][size=12pt]。[/size][/font][size=12pt][/size]
[font=宋体][size=12pt]解压缩内核源代码包并进入源代码目录:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    #tar –jvxf linux-2.6.23.12.tar.bz2[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    #cd linux-2.6.23.12[/color][/b][/font][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]安装相关的头文件:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    #make mrproper[/b][/color][/font]
[font=宋体][color=#4f81bd][b]    #make headers_check[/b][/color][/font]
[font=宋体][color=#4f81bd][b]    #make INSTALL_HDR_PATH=dest header_install[/b][/color][/font]
[font=宋体][color=#4f81bd][b]    #cp –rv dest/include/* /toolchain/include[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    #cd ../[/color][/b][/font][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]关于内核操作有什么不了解的,可以使用[/size][/font][b][size=12pt][font=Times New Roman]make help[/font][/size][/b][font=宋体][size=12pt]命令获得帮助。[/size][/font][size=12pt][/size]
[font=宋体][size=12pt]解压缩[/size][/font][size=12pt][font=Times New Roman]glibc[/font][/size][font=宋体][size=12pt]的源代码包并进入源代码目录:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    #tar –jvxf glibc-2.7.tar.bz2[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    #cd glibc-2.7[/color][/b][/font][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]与[/size][/font][size=12pt][font=Times New Roman]gcc[/font][/size][font=宋体][size=12pt]一样,还需要单独的目录来创建,建立[/size][/font][size=12pt][font=Times New Roman]build[/font][/size][font=宋体][size=12pt]目录:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    #mkdir build[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    #cd build[/color][/b][/font][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]由于[/size][/font][size=12pt][font=Times New Roman]glibc[/font][/size][font=宋体][size=12pt]不再支持[/size][/font][size=12pt][font=Times New Roman]i386[/font][/size][font=宋体][size=12pt]体系了,因此它的开发者们建议在创建[/size][/font][size=12pt][font=Times New Roman]glibc[/font][/size][font=宋体][size=12pt]是,最好使用[/size][/font][size=12pt][font=Times New Roman]-march=i486[/font][/size][font=宋体][size=12pt]编译选[/size][/font]
[font=宋体][size=12pt]项。的确如此,如果你不指定这个选项,会创建失败。但是毕竟现在[/size][/font][size=12pt][font=Times New Roman]i486[/font][/size][font=宋体][size=12pt]用的已经很少了,我们[/size][/font]
[font=宋体][size=12pt]也可以不考虑兼顾,为了进一步提高性能,我建议使用[/size][/font][size=12pt][font=Times New Roman]-march=i686[/font][/size][font=宋体][size=12pt]编译选项。你可以通过下面的[/size][/font]
[font=宋体][size=12pt]命令完成这些:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][b][color=#4f81bd]    #echo “CFLAGS += -march=i686” > configparms[/color][/b][/font]
[/size][size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]接着,为创建[/size][/font][size=12pt][font=Times New Roman]glibc[/font][/size][font=宋体][size=12pt]做准备工作:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    #configure –prefix=/toolchain –disable-profile –enable-add-ons \[/b][/color][/font]
[font=宋体][color=#4f81bd][b]    --enable-kernel=2.6.0 –with-binutils=/toolchain/bin –without-gd \[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    --with=headers=/toolchain/include –without-selinux[/color][/b][/font][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]各选项的含义如下:[/size][/font]
[size=3][font=宋体]    [/font][b][size=12pt][font=Times New Roman]--disable-profile[/font][/size][/b][/size]
[font=宋体][size=12pt]    忽略掉[/size][/font][size=12pt][font=Times New Roman]profiling[/font][/size][font=宋体][size=12pt]信息相关的库文件创建,这个时候一般不需要。[/size][/font]
[size=3][font=宋体]    [/font][b][size=12pt][font=Times New Roman]--enable-add-ons[/font][/size][/b][/size]
[font=宋体][size=12pt]    这个指示[/size][/font][size=12pt][font=Times New Roman]glibc[/font][/size][font=宋体][size=12pt]使用附加的[/size][/font][size=12pt][font=Times New Roman]NPTL[/font][/size][font=宋体][size=12pt](本地[/size][/font][size=12pt][font=Times New Roman]POSIX[/font][/size][font=宋体][size=12pt]线程库)包作为线程库。[/size][/font]
[size=3][font=宋体]    [/font][b][size=12pt][font=Times New Roman]--enable-kernel=2.6.0[/font][/size][/b][/size]
[font=宋体][size=12pt]    告诉[/size][/font][size=12pt][font=Times New Roman]glibc[/font][/size][font=宋体][size=12pt]要支持[/size][/font][size=12pt][font=Times New Roman]2.6.x[/font][/size][font=宋体][size=12pt]内核。[/size][/font]
[size=3][font=宋体]    [/font][b][size=12pt][font=Times New Roman]--with-binutils=/toolchain/bin[/font][/size][/b][/size]
[font=宋体][size=12pt]    这个参数并不是必要的,只是为了防止在创建[/size][/font][size=12pt][font=Times New Roman]glibc[/font][/size][font=宋体][size=12pt]时用错了[/size][/font][size=12pt][font=Times New Roman]binutils[/font][/size][font=宋体][size=12pt]程序。这里保证使用刚才创建[/size][/font]
[font=宋体][size=12pt]    好的[/size][/font][size=12pt][font=Times New Roman]binutils[/font][/size][font=宋体][size=12pt]。[/size][/font]
[size=3][font=宋体]    [/font][b][size=12pt][font=Times New Roman]--without-gd[/font][/size][/b][/size]
[font=宋体][size=12pt]    保证不生成[/size][/font][size=12pt][font=Times New Roman]memusagestat[/font][/size][font=宋体][size=12pt]程序,这个程序会产生对你现有系统的依赖。[/size][/font]
[size=3][font=宋体]    [/font][b][size=12pt][font=Times New Roman]--with-headers=/toolchain/include[/font][/size][/b][/size]
[font=宋体][size=12pt]    这个选项就是告诉[/size][/font][size=12pt][font=Times New Roman]glibc[/font][/size][font=宋体][size=12pt],使用刚刚安装的内核都文件创建自己。[/size][/font]
[size=3][font=宋体]    [/font][b][size=12pt][font=Times New Roman]--without-selinux[/font][/size][/b][/size]
[font=宋体][size=12pt]    不提供[/size][/font][size=12pt][font=Times New Roman]SELinux[/font][/size][font=宋体][size=12pt]特性的支持,因为[/size][/font][size=12pt][font=Times New Roman]toolchain[/font][/size][font=宋体][size=12pt]是不需要的。[/size][/font][size=12pt][/size]
[font=宋体][size=12pt]在这个阶段你要是看到下面的警告你就不用管它,跟你没有任何关系,也不会有什么影响的。[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    configure: WARNING:[/b][/color][/font]
[font=宋体][color=#4f81bd][b]    *** These auxiliary programs are missing or[/b][/color][/font]
[font=宋体][color=#4f81bd][b]    *** incompatible versions: msgfmt[/b][/color][/font]
[font=宋体][color=#4f81bd][b]    *** some features will be disabled.[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    *** Check the INSTALL file for required versions.[/color][/b][/font][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]创建软件包:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][b][size=2][color=#4f81bd]    #make[/color][/size][/b][/font]
[size=12pt][font=Times New Roman][/font][/size]
[font=宋体][size=12pt]在安装[/size][/font][size=12pt][font=Times New Roman]glibc[/font][/size][font=宋体][size=12pt]的过程中,它会警告缺少[/size][/font][size=12pt][font=Times New Roman]/toolchain/etc/ld.so.conf[/font][/size][font=宋体][size=12pt]文件。其实没什事,不会有什么影响,只要提[/size][/font]
[font=宋体][size=12pt]供一个空文件它就闭嘴了:[/size][/font][size=12pt][/size]
[size=12pt][font=Times New Roman][/font][/size]
[size=2][font=宋体][color=#4f81bd][b]    #mkdir –v /toolchain/etc[/b][/color][/font]
[font=宋体][color=#4f81bd][b]    #touch /toolchain/etc/ld.so.conf[/b][/color][/font][/size]
[font=宋体][i][b][size=3][color=#4f81bd][/color][/size][/b][/i][/font]
[font=宋体][size=12pt]一切顺利就可以安装了:[/size][/font]
[font=宋体][size=12pt][/size][/font]
[size=2][font=宋体][b][color=#4f81bd]    #make install[/color][/b][/font]
[/size][font=宋体][size=12pt][/size][/font]
[font=宋体][size=12pt]恭喜你,又干了一件了不起的事情,不过别忘了收尾阿,空间有限。[/size][/font]
[font=宋体][size=12pt][/size][/font]
[size=2][font=宋体][color=#4f81bd][b]    #cd ../[/b][/color][/font]
[font=宋体][color=#4f81bd][b]    #rm –rf build[/b][/color][/font]
[font=宋体][b][color=#4f81bd]    #cd ../[/color][/b][/font][/size]

[b][font=宋体][size=2][color=#4f81bd][/color][/size][/font][/b]
[b][font=宋体][size=3][color=black](未完,待续......)[/color][/size][/font][/b]

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

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

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

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

这个不就是LFS了么?呵呵

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

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

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

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

[quote]原帖由 [i]nihui[/i] 于 2008-1-20 11:50 发表 [url=http://www.linuxfans.org/bbs/redirect.php?goto=findpost&pid=4840886&ptid=182232][img]http://www.linuxfans.org/bbs/images/common/back.gif[/img][/url]
3.0 理应基于 2.1 开发的吧~   :shock: :shock: [/quote]


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

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

[quote]原帖由 [i]ghosTM55[/i] 于 2008-1-20 11:07 发表 [url=http://www.linuxfans.org/bbs/redirect.php?goto=findpost&pid=4840882&ptid=182232][img]http://www.linuxfans.org/bbs/images/common/back.gif[/img][/url]
这个不就是LFS了么?呵呵 [/quote]


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

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

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

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

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

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

[quote]原帖由 [i]Jagen[/i] 于 2008-1-20 12:29 发表 [url=http://www.linuxfans.org/bbs/redirect.php?goto=findpost&pid=4840888&ptid=182232][img]http://www.linuxfans.org/bbs/images/common/back.gif[/img][/url]



那就继续升级了,为啥还叫3.0? [/quote]

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

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

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

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

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

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

提供两份资料供大家参考

很激动人心的消息,虽然我很忙没时间参加开发,但是看着这个工具链的制作,有些过于 LFS 化了。
小弟不才,提供两份制作工具链时可能需要用到的参考资料:
[url=http://lamp.linux.gov.cn/Linux/Glibc-GCC-Binutils-Install.html]Glibc GCC Binutils 安装指南[/url]
[url=http://lamp.linux.gov.cn/Linux/optimize_guide.html]GCC编译优化指南[/url]
建议 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 '[Requesting program interpreter: /www/lib/ld-linux.so.2]' && 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 '[Requesting program interpreter: /www/lib/ld-linux.so.2]' && 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

下面是 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 '[Requesting program interpreter: /lib/ld-linux.so.2]' &&
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 '[Requesting program interpreter: /lib/ld-linux.so.2]' &&
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

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

学习了

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

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

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

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

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

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

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

[quote]原帖由 [i]haulm[/i] 于 2008-1-26 17:15 发表 [url=http://www.linuxfans.org/bbs/redirect.php?goto=findpost&pid=4841489&ptid=182232][img]http://www.linuxfans.org/bbs/images/common/back.gif[/img][/url]
有点复杂,不过内容的确就是LFS工具链原文的翻译,有些错误的地方是标点符号并有少量的漏填指令。具体内容可以参考

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

ht ... [/quote]

兄弟,发现错误的地方,标注一下好吗?

haulm 发表于 2008-1-27 17:24

[quote]原帖由 [i]Jagen[/i] 于 2008-1-26 21:25 发表 [url=http://www.linuxfans.org/bbs/redirect.php?goto=findpost&pid=4841506&ptid=182232][img]http://www.linuxfans.org/bbs/images/common/back.gif[/img][/url]


兄弟,发现错误的地方,标注一下好吗? [/quote]

其实没有什么问题,也就是排版问题,几个横杠和引号不应该是双字节的,另外

CC=”gcc -B/usr/bin/”在编译GCC时没有体现在指令中,这样读者只有完全按文章步骤操作才会避免错误,有些朋友比如我会不停地关闭和打开新的终端进行操作。

heshan 发表于 2008-2-27 16:18

多谢楼主! 收藏了。

young1012 发表于 2008-3-12 22:35

想学,但是要学的太多了!

luozhenwu 发表于 2008-3-20 18:21

很好。:-D

jiangtao9999 发表于 2008-8-26 22:02

按照这个帖子,我发现根本不能建立一个编译环境……无尽的 Error……
是我的 RPWT 还是帖子有问题……

haulm 发表于 2008-8-26 23:04

[quote]原帖由 [i]jiangtao9999[/i] 于 2008-8-26 22:02 发表 [url=http://www.linuxfans.org/bbs/redirect.php?goto=findpost&pid=4863988&ptid=182232][img]http://www.linuxfans.org/bbs/images/common/back.gif[/img][/url]
按照这个帖子,我发现根本不能建立一个编译环境……无尽的 Error……
是我的 RPWT 还是帖子有问题…… [/quote]

用se兄的2.5的srpm包进行一次更新吧,这堆指南除了工具链编译以外再无实质上的内容。

jiangtao9999 发表于 2008-8-27 00:02

我现在就是在搭建一个可以 chroot 的工具链。
这样可以搭建一个比较好的开始编译全套 rpm 的基础环境。
用这个工具链来编译出一套 rpm 基础环境包。

MQQ2 发表于 2008-10-16 01:22

ok:lol: :lol: :lol: :lol: :lol:

kns1024wh 发表于 2008-10-17 13:37

有机会积极参与

有机会积极参与

qsdys 发表于 2009-10-15 10:21

学习了,谢谢!

zldiy 发表于 2010-3-4 16:23

我的天啊。看来起步学这个,真感觉是难点。要学的

fantasticfears 发表于 2010-3-21 14:01

必须先学一遍LFS再来看...才比较好

zy_sunshine 发表于 2010-3-21 14:04

工具链不是任何版本都可以的,要参考cross compile资料。工具链各个包的版本是一整套的。

tianx1 发表于 2012-5-7 00:53

不知道 我啥时才能入进门啊。。。

haulm 发表于 2012-5-10 21:08

据说 freebsd 内核和支持环境是一起考虑的,工具链也不见得非要按照 LFS 来生成,那样太痛苦了,真的没必要,除非你有洁癖,事实上总是这么生成的系统人家认为是干静的,我也可以认为是发育不全的。虽然我已经习惯不停地编译,但我认为有时间和能力还不如研究点有意义的事情。LFS 用来检验底层稳定性或实现底层稳定应该是重要的,只可惜 linux 升级如此频繁,以至于一个工具链并不是各组件都配合地很好,这很好解释为什么 人们认为 FreeBSD 更专业一些,而 Linux 更流行一点。

[[i] 本帖最后由 haulm 于 2012-5-10 21:16 编辑 [/i]]

页: [1] 2

Powered by Discuz! Archiver 6.1.0F  © 2001-2007 Comsenz Inc.