免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: snow888
打印 上一主题 下一主题

从 0 开始,打造自己的 Linux 。 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
31 [报告]
发表于 2012-04-12 16:10 |只看该作者
本帖最后由 snow888 于 2012-04-12 16:11 编辑

好了,通过上面的努力,我们已经有了一个基本的工具链,从 gcc 到汇编器 as , 再到链接器 ld , 是不是很有趣?

刚刚测试了一下,binutils 在编译的时候,如果带有 --enablllle-targets=all 则编译在 objdump 的时候会失败,不知道是因为我在虚拟机上操作的原因,还是母体的编译器的原因


我们来找找那几个特殊的文件吧。

进入 /My_Operation/myuser/tmptools/lib/gcc/i686-pc-linux-gnu/4.0.3 下面,

ls -al 看看,你能看到什么?   ^_^.

这几个所有程序的总纲文件,是不是都已经存在了?

还记得我们在编译 binutils 的时候说过什么?

如果用我们编译生成的 ld 来开发程序,目前链接的依然是母体的 libgcc_s.so.1 或者是 libgcc_eh.a ,郁闷吗?不要紧,我们来调整一下。

再次进入 /My_Operation/myuser/tools_src/binutils-2.16.1/ld

$ gmake -k clean                           ;; 我们将 ld 目录下所编译生成的所有文件删除
$ gmake LDFLAGS="-static" LIB_PATH=/My_Operation/myuser/tmptools/lib                   ;; 让我们的链接器在链接二进制文件的时候找 /My_Operation/myuser/tmptools/lib 目录下的那些个特殊文件。
$ gmake install

为什么在这个时候调整?因为我们已经有了基础了

特别要注意的是,我们在编译 gcc 的时候, host 、target、build 这三个参数与编译 binutils 的时候要完全一致,否则你的 gcc 将找不到汇编器和链接器,切记!切记!
如无特殊说明,在我们下面的编译过程中,这三个参数都采用前面的值,不再重复提醒。

另一个需要注意的地方是,在安装完 binutils 之后,我们需要进入 /My_Operation/myuser/tmptools/bin 目录,将 ld 改名为 ld-new ,进入 /My_Operation/myuser/tmptools/i686-pc-linux-gnu/bin 目录,将 ld 改名为 ld-new 。

这样做的原因是我们的 glibc 还没有安装,有大量的软件包在链接的时候会使用 -l 参数来指定我们编译的程序需要链接哪些库包,遗憾的是,目前我们还没有,因此使用这个新的调整后的 ld 链接器会出现大量的错误。


下面我们该开始安装 linux-libc-headers 了,这个需要讲的地方不多,其实就是 linux 内核的头文件。

展开,拷贝到 /My_Operation/myuser/tmptools/include 目录下即可。

$ cd linux-libc-header-2.6.12.0/include
$ cp -Rv asm-i386 /My_Operation/myuser/tmptools/include/asm
$ cp -Rv linux /My_Operation/myuser/tmptools/include



论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
32 [报告]
发表于 2012-04-13 00:15 |只看该作者
本帖最后由 snow888 于 2012-04-13 00:16 编辑

好了,下面我们需要系统的基本库了,来,我们继续。

下面我们需要安装 glibc 了,这个软件包是什么?用过 Unix 系统的朋友都知道,这个咚咚相当于我们系统中的 /lib 、 /usr/lib 、/usr/local/lib 目录下的所有文件,是我们的系统能够得以正确运行的基础支撑库文件。

不多解释了,需要详细了解这个咚咚中间每个包得作用的朋友,可以自己去 google ,或者到 www.gnu.org 上去看看文档(得先打好 E 文基础哦 ^_^.)

我们还是构建一个新的编译目录

$ mkdir glibc_build
$ cd glibc_build
$ ../glibc-2.3.6/configure --prefix=/My_Operation/myuser/tmptools ----disable-profile --enable-add-ons \
--enable-kernel=2.6.0 --with-binutils=/My_Operation/myuser/tmptools/bin \
--without-gd --with-headers=/My_Operation/myuser/tmptools/include \
--without-selinux

这个地方解释一下:

--enable-addd-ons                                                                           ;;这个指示 Glibc 使用附加的 NPTL 包作为线程库。
--enable-kernel=2.6.0                                                                      ;;通知Glibc 编译出支持 2.6.x 内核的库。
--with-binutils=/My_Operation/myuser/tmptools/bin                        ;;指定在编译 glibc 时使用我们前面构建的 binutils 工具 ( ld 除外,我们将它改名了)
--without-gd                                                                                     ;;保证不生成 memusagestat 程序,这个程序会顽固地将我们生成的库文件连接到宿主系统的库文件(libgd, libpng, libz 等等)。
--with-headers=/My_Operation/myuser/tmptools/include                ;; 指定我们使用自己安装的 linux 内核头文件
--without-selinux                                                                              ;; 我们不打算安装 selinux ,如果要安装这个咚咚,那么我们在这里需要打开。


$ make
$ make install

激动人心的时刻到来了
下面我们开始调整工具链,让我们前面构建的环境出现一个能彻底脱离母体环境的工具链。
step 1)
            进入 /My_Operation/myuser/tmptools/bin 目录,将我们的 ld-new 改成 ld
            $ cd /My_Operation/myuser/tmptools/bin
            $ mv ld-new ld
step 2)
            进入 /My_Operation/myuser/tmptools/i686-pc-linux-gnu/bin 目录,将我们的 ld-new 改成 ld
            $ cd /My_Operation/myuser/tmptools/i686-pc-linux-gnu/bin
            $ mv ld-new ld
step 3)
            进入 /My_Operation/myuser/tmptools/lib/gcc/i686-pc-linux-gnu/4.0.3 目录,修改我们的链接配置文件 specs
             $ cd /My_Operation/myuser/tmptools/lib/gcc/i686-pc-linux-gnu/4.0.3
             $ vi specs
            将其中的 /lib/ld-linux.so.2 全部修改成 /My_Operation/myuser/tmptools/lib/ld-linux.so.2

修改完成以后,我们来测试一下:
进入 /tmp 目录,编写一个测试文件:a.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main ( void )
  5. {
  6.               puts(" I am test program file!\n");
  7.               return 0;
  8. }
复制代码
设置你的环境变量,启用你刚才构建的编译环境:
$ export PATH=/My_Operation/myuser/tmptools/bin:$PATH
编译你的测试程序:
$ gcc -o a a.c
检查你刚才编译的文件,看看编译的信息
$ ldd a
看看输出了什么信息?

是不是有点成就感了?到现在为止,你已经成功了 三分之一了。

时间关系,今天就暂时先讲到这里。

论坛徽章:
0
33 [报告]
发表于 2012-04-13 08:49 |只看该作者
谢谢老师!还有呢?

论坛徽章:
20
CU大牛徽章
日期:2013-03-13 15:29:072015亚冠之阿尔希拉尔
日期:2015-09-12 09:33:562015年亚冠纪念徽章
日期:2015-09-22 17:12:202015亚冠之本尤德科
日期:2015-10-29 16:18:18神斗士
日期:2015-11-23 13:37:23青铜圣斗士
日期:2015-12-07 10:14:28平安夜徽章
日期:2015-12-26 00:06:3015-16赛季CBA联赛之佛山
日期:2016-01-18 08:59:06shanzhi
日期:2016-06-17 17:59:3115-16赛季CBA联赛之同曦
日期:2016-11-03 14:43:552015七夕节徽章
日期:2015-08-21 11:06:17丑牛
日期:2014-12-30 16:06:17
34 [报告]
发表于 2012-04-13 12:14 |只看该作者
楼主辛苦了

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
35 [报告]
发表于 2012-04-13 12:52 |只看该作者
本帖最后由 方兆国 于 2012-04-13 13:01 编辑


你说的GENTOO就这个东西吗?这个貌似没有iso文件……

回复 13# chenyx


   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
36 [报告]
发表于 2012-04-13 12:57 |只看该作者
回复 35# 方兆国


    这玩意儿和 lfs 的区别在于它给了工具链,而 lfs 的工具链需要自己打造。

另一个区别是这玩意儿有一个包管理器,而 lfs 没有包管理器,其它的部分大同小异。

事实上,到目前为止,我的这篇文章,工具链已经形成了,下面的部分除了 包管理器以外,其它的部分基本相同了。

所以,这玩意儿不会有 iso 的。它是完全让你自己去定制自己的系统的。

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
37 [报告]
发表于 2012-04-13 13:06 |只看该作者
回复 36# snow888


    其实我最关心的是怎么在母体环境下给子系统安装GRUB引导……

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
38 [报告]
发表于 2012-04-13 13:18 |只看该作者
回复 37# 方兆国


    那个太简单,最难的部分是形成一个完全脱离母体的工具链和完全脱离母体的使用工具。

论坛徽章:
381
CU十二周年纪念徽章
日期:2014-01-04 22:46:58CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52CU大牛徽章
日期:2013-03-14 14:08:55CU大牛徽章
日期:2013-04-17 11:17:19CU大牛徽章
日期:2013-04-17 11:17:32CU大牛徽章
日期:2013-04-17 11:17:37CU大牛徽章
日期:2013-04-17 11:17:42CU大牛徽章
日期:2013-04-17 11:17:47CU大牛徽章
日期:2013-04-17 11:17:52CU大牛徽章
日期:2013-04-17 11:17:56
39 [报告]
发表于 2012-04-13 13:45 |只看该作者
回复 35# 方兆国


    你的那个是什么地方的?应该在http://www.gentoo.org/main/en/where.xml下载iso

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
40 [报告]
发表于 2012-04-13 13:51 |只看该作者
本帖最后由 snow888 于 2012-04-13 14:04 编辑

好,到目前为止,我们已经有了一个完全脱离母体的编译工具,下面我们将使用这个工具来完成我们下面的工作,由于我们下面可能要频繁的在母体和这个独立的编译环境进行切换,为了方便这里给大家贡献两个小工具。

在 work 用户下建立 bin 目录,并在该目录下编写两个 shell 脚本命令。

403.sh
  1. #!/bin/sh
  2. OLD_PATH=$PATH
  3. export OLD_PATH
  4. GCC_HOME=/My_Operation/myuser/tmptools
  5. export GCC_HOME
  6. PATH=$GCC_HOME/bin:$PATH
  7. export PATH
复制代码
un.sh
  1. #!/bin/sh
  2. PATH=$OLD_PATH
  3. export PATH
  4. unset OLD_PATH
  5. unset GCC_HOME
复制代码
如何使用?
在我们需要切换到独立的这个编译环境的时候,我们输入 $ . 403.sh
在我们需要回到母体环境的时候,我们输入 $ . un.sh
"." 与命令之间有一个空格

下面我们开始清理留在 gcc 4.0.3 环境的母体的 fixincl , 这个已经不需要了。
切换到 gcc 4.0.3 的编译环境
$ . 403.sh

执行下面的脚本(我建议你直接拷贝执行,可以编写一个 shell 脚本文件,然后用 sh <脚本文件> 的方式执行)。
GCC_INCLUDEDIR=`dirname $(gcc -print-libgcc-file-name)`/include &&
find ${GCC_INCLUDEDIR}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; &&
rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_INCLUDEDIR}/*` &&
unset GCC_INCLUDEDIR

执行完成以后,我们的 gcc 403 就几乎与母体没有任何关系了。下面我们用这个 gcc 4.0.3 来编译我们的新系统的工具。如果没有特殊说明,我们下面所有的编译都采用静态编译的方式,并且安装目录都指向 /My_operation/myuser/ 目录,这个目录是我们最后脱离母体后的新生系统的根目录。

下面我们以 make 3.8.0 为例,来进行讲解,其它的工具安装与此大同小异,不重复讲解了。

step 1)设置编译链接环境
          $ export CC=gcc
          $ export CFLAGS="-g -O2 -Bstatic"
          $ export LDFLAGS="-all-static"
          $ export CXXFLAGS="-g -O2 -Bstatic"
          $ export CXX=gcc
特别注意:如果某些软件的编译环境不认 LDFLAGS="-all-static" 可将其改为 LDFLAGS="-static"
step 2) 创建编译目录
          $ mkdir make_build
step 3) 生成编译的脚本文件 Makefile
          $ ../make-3.8.0/configure --prefix=/My_Operation/myuser  --host=i686-pc-linux-gnu --target=i686-pc-linux-gnu --build=i686-pc-linux-gnu --enable-static --disable-rpath
step 4) 检查生成的 Makefile 文件,发现不是静态编译的,将对应的环境变量参数,加入到 Makefile 文件中对应的环境变量参数中。
step 5) 编译并安装
          $ make
          $ make install


这几个参数的说明,不需要再详细讲解了吧,只强调一点 --enable-static 指出编译一个静态的环境出来, --disable-rpath ,将生成的文件脱离硬编码的目标路径

为什么要这样做?
因为我们的这个系统第一次脱离母体以后,我们的这些个链接文件都不在根目录对应的子目录之下,而在 /tmptools 目录下,而一旦系统脱离了这个环境,我们的工具如果是动态编译的,那将使得我们的命令在执行的时候无法找到 /My_Operation/myuser/tmptools 目录下的动态链接库文件,因为这个目标路径已经移动了

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP