- 论坛徽章:
- 1
|
本帖最后由 snow888 于 2012-04-02 14:02 编辑
sunlan 发表于 2012-04-02 08:07 ![]()
把过程贴出来,给你加精
老大,其实就是两个二次编译,然后将 ld 拷贝到 /bin 和 /usr/bin , 结果就成这样子了。
不过程序代码修改的量比较大。第一次编译没有要修改的地方,就是按照你的那个方法实现的。
然后用编译的 gcc 编译 binutils 这个软件包。这个软件包需要在这个源码的根目录下进行编译,这次编译也不需要修改程序代码,编译完成以后,不能直接安装,还得进入到 ld 目录(默认这个目录是不编译的,这也是开始我编译的很久就是没有 ld 的原因),再次编译 ld ,然后再 make install 进行安装
安装 ld 之前,需要将 ldmain.c 文件进行一下修改。前面编译的 gcc 会在调用 ld 时传入一个 -Qn 的参数,这个参数 gnu ld 是不支持的,我们在 ldmain.c 最前面就将其屏蔽掉(对 argv 的参数进行处理 )。
二次编译 gcc ,第二次编译时需要带上 --with--gnu-as 和 --with-gnu-ld 的参数,这次编译,你会发现原来能正确编译的程序代码,这次无法通过了,原因就是前面你用的是 sco 自带的 as 汇编和 ld 链接,而这次用的是 gas 和 gld , 所以通不过了,没有办法,改程序吧。
这个程序我改了有两三天,google又不给力。找资料很郁闷,当时只想解决问题,也没有及时整理。主要是编译通不过的地方,另外就是 在 sco 上默认不会将 elf 和 coff 的二进制格式包含进来(具体见 gcc 下面有一个 README.SCO) ,好像是因为 SCO 和 gnu 的官司问题。所以需要将 binutils/include 下的那些定义的 aout、elf、coff、opcode、nlm 等文件格式包含到 gcc 里面来,然后将 binutils 目录下的 bfd 目录的文件在 gcc 里面包含进来,在形成汇编码之前要对处理的这些个程序代码形成的汇编前面添加出这些文件的格式头信息。
再次编译你的 gcc ,如果没有问题,那么恭喜,你已经成功了一半。
二次编译 binutils 软件包,这次编译,你会发现 这个 binutils 又编译不过了,原来已经能正确通过的,现在又通不过了。
原因还是因为你这个时候的 ld 还是调用的标准的 ld 下的格式信息文件,不是自己的标准的格式信息文件,你修改完成的 gcc 传入的时候,这个 ld 反而又不认了,没关系,我们再改。
需要指出的是,这次的编译你得带上 BUILD_PATH ,这个参数指定你的ld 从哪个地方链接标准库,这是关键,否则你的 gnu ld 还是会链接你的系统的标准库,而不是你自己构建的标准库 。
一边编译,一边修改,直到你的编译通过,那么好,这个时候,你已经有了一个基本的编译环境了。
再来,
我们开始安装 glibc , 这个包就是和原生的标准库包一样的咚咚,貌似函数库还丰富一些。
这个咚咚用你自己的 gcc 编译,修改的地方不多,大概有 20 ~30 处左右,改完就完事了。
安装完成以后,你就已经有了一个基本的系统了。
下面再就是安装一些工具了,比如说gettext、autogen、dejagnu、fsu-thread-3.1.4 等等。这些咚咚几乎是没有改动,直接就过去了。
好像 fsu-threads 有两个头文件要改动,socket.h 里面有几个信息需要定义一下。signal.h 里面有大量的 define 需要定义一下 , errno.h 中加一个 extern int h_errno 。
最后,我们为了让这个咚咚脱离原生的编译环境,就直接将 ld 和 as 替换到系统上去了,有两个 一个是 /bin 下面,一个是 /usr/bin 下面(原生的建议不要删除,我也不知道删除了有问题没有,还是保留吧,可以换一个名字,比如说 old_xx 之类的)。
|
|