Magic Linux开发入门指南Word下载.docx
- 文档编号:16650448
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:55
- 大小:58.53KB
Magic Linux开发入门指南Word下载.docx
《Magic Linux开发入门指南Word下载.docx》由会员分享,可在线阅读,更多相关《Magic Linux开发入门指南Word下载.docx(55页珍藏版)》请在冰豆网上搜索。
binutils是一个二进制工具集合,包含了汇编器、反汇编器、连接器、
elf可执行文件分析器等重要工具,这些工具在进行Linux各种应用的开发时,
发挥着巨大的作用。
你可以在/usr/bin目录中找到他们。
gcc是一个编译器集合,包含了C、C++、Objective-C、Fortran、Java
和Ada语言,同时为这些语言提供了一些标准库,如:
libstdc++、libgcj,
……。
gcc的C是Linux的标准编译器,linux内核完全依赖于gcc,其他编译
器不能编译linux内核。
由于ABI(ApplicationBinaryInterface)的不兼
容,其他编译器也不适合Linux上的大多数软件的编译,尤其那些使用C++作为
开发语言的软件系统。
目前IntelC/C++编译器开始兼容gcc的ABI,因此现在
可以采用IntelC/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环境可以直接创建MagicLinux的所有,最后你得到的还
是属于你现在使用的这个发布。
因为你现在的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
#mkdirtoolchain
在你的根目录创建一个连接到toolchain上(如果不了解,google一下ln)。
#ln-sv/mnt/ml/toolchain/toolchain
创建sources目录。
#mkdirsources
将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环境变量。
#exportPATH=/toolchain/bin:
$PATH
PATH环境变量指定了shell命令的默认搜索路径。
我们修改PATH环境变量使得在你
的gcc可用时,默认执行的是它,而不是系统自带的。
环境已经准备好了,我们开始吧。
2.创建新的gcc环境
为了创建完全独立于你现有系统的gcc环境,我们要创建两次binutils和gcc。
他们创建的次序是很重要的。
我们现在进行第一次创建。
进入sources目录。
#cdsources
2.1创建binutils
首先创建binutils,是因为在创建gcc和glibc时,它们会检测连接器和汇编器,
以便决定它们能够开启那些特性。
整个过程大概需要5分钟(根据你机器的处理能力会
有很大的不同),占用200MB左右的磁盘空间。
解压缩源代码包,并进入解压后的目录:
#tar-jvxfbinutils-2.18.tar.gz
#cdbinutils-2.18
由于binutils在某些时候会有一点小问题,要修复它,需要下在一个补丁,对应2.18
版本的补丁是:
binutils-2.18-configure-1.patch。
#patch–Np1-i../binutils-2.18-configure-1.patch
binutils的文档说应该在一个独立的目录中创建binutils。
那就创建一个build目录。
#mkdirbuild
#cdbuild
现在为创建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
创建完成后,安装:
#makeinstall
别着急,还没完事。
还得调整一下:
#make–Cldclean
#make–CldLIB_PATH=/toolchain/lib
make参数的含义是:
-Cldclean
告诉make,删除所有子目录ld中编译生成的文件。
-CldLIB_PATH=/toolchain/lib
这个选项重新编译ld子目录中的所有文件。
LIB_PATH是Makefile的一个变量,
在命令行里制定他,可以覆盖默认值,并让它指向/toolchain/lib目录。
这个变
量的值指定了连接器的缺省库搜索路径。
手工将新的程序复制到/toolchain/bin目录:
#cp–vld/ld-new/toolchain/bin
好了,binutils创建完成了,你现在可以删除build目录了。
但是不要删除
binutils-2.18目录,因为还要编译一次呢。
退回到sources目录,准备gcc的创建工
#cd../
#rm–rfbuild
2.2创建gcc
连接器准备好了,但我们这次先不使用它,没有这个必要,因为我们还需要再次
创建gcc的,那时再用也不迟。
这个过程大概会花费你50分钟的时间和650MB的磁盘空
间。
解压缩gcc的源代码包并进入源代码目录。
#tar–jvxfgcc-4.2.2.tar.bz2
#cdgcc-4.2.2
gcc与binutils一样,建议你在一个独立的目录中创建它。
创建build目录。
为创建gcc做准备。
#../configure–prefix=/toolchain–with-local-prefix=/toolchain\
--disable-nls–enable-shared–enable-languages=c
也就是不使用你刚创建完
的那个连接器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,
那就没什么可说的了。
准备好了,我们可以开始创建了:
创建完成,安装:
最后你还应该创建一个符号连接cc到这个新的gcc,因为好多时候会用cc而不是gcc,这是为
了与Unix平台保持一致,便于程序的移植。
#ln–vsgcc/toolchain/bin/cc
好了,gcc创建完成了,接下来的创建过程会自动使用这个gcc的,因为你修改了PATH环境变
量。
做些首尾工作,要不然你的磁盘可能吃紧了。
2.3创建glibc
前面我说过,glibc是自包含的,不会依赖于那个软件包。
但是我也说过,它是用户程序与
内核交流的标准借口,因此对内核还是有一定依赖的。
但是这并不相矛盾,因为只要是一个系
列的内核,基本上是没多少关系的,比如现今的2.6系列,它们会有提供统一的系统调用。
glibc需要了解内核的系统调用和这些调用相关的一些数据结构。
Linux内核做得很好,不需
要有内核的二进制文件,一切都包含在了内核的公用头文件中了。
这里说些题外话,如果你够
牛的话,其实完全可以不用glibc,只利用这些头文件就可以写出合适的用户程序的,甚至比利
用glibc的更为优秀。
不过如果你的确那么牛,这篇文章也就不适合你了。
不多说了,下载一个内核源代码到你的source目录吧。
最新的是2.6.23.12。
解压缩内核源代码包并进入源代码目录:
#tar–jvxflinux-2.6.23.12.tar.bz2
#cdlinux-2.6.23.12
安装相关的头文件:
#makemrproper
#makeheaders_check
#makeINSTALL_HDR_PATH=destheader_install
#cp–rvdest/include/*/toolchain/include
关于内核操作有什么不了解的,可以使用makehelp命令获得帮助。
解压缩glibc的源代码包并进入源代码目录:
#tar–jvxfglibc-2.7.tar.bz2
#cdglibc-2.7
与gcc一样,还需要单独的目录来创建,建立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:
***Theseauxiliaryprogramsaremissingor
***incompatibleversions:
msgfmt
***somefeatureswillbedisabled.
***ChecktheINSTALLfileforrequiredversions.
创建软件包:
在安装glibc的过程中,它会警告缺少/toolchain/etc/ld.so.conf文件。
其实没什事,不会有什么影响,只要提
供一个空文件它就闭嘴了:
#mkdir–v/toolchain/etc
#touch/toolchain/etc/ld.so.conf
一切顺利就可以安装了:
恭喜你,又干了一件了不起的事情,不过别忘了首尾阿,空间有限。
2.4让这个新的gcc环境能够真正的工作起来
编译器、连接器、程序库都创建好了,可以开始创建MagicLinux了吧?
呵呵,不行!
这个
新的gcc环境还没有真正工作起来呢。
不信,我们做一个实验试试。
编写一个最简单的C代码:
#echo'
main(){}'
>
ttt.c
#gccttt.c
#readelf-la.out
看看结果,是不是有一行类似下面的内容:
[Requestingprograminterpreter:
/lib/ld-linux.so.2]
这是不对的。
readelf是分析elf可执行文件(Linux下可执行文件的格式)格式的工具,-l选项是
用来显示可执行文件各段头内容的,通过它可以了解一个可自行文件的依赖关系。
上面的结果
表明新的gcc产生的可执行文件还是依赖于你现有系统的ld-linux.os.2,这是glibc的一部分。
这是为什么?
该怎么办?
问题在创建binutils是就已经作了一些解决,但是还没有完全解决。
回想一下,在安装完
binutils后,还做了如下操作:
#make-Cldclean
#make-CldLIB_PATH=/toolchain/lib
#cp-vld/ld-new/toolchain/bin
创建了一个ld-new,而且还复制到了/toolchain/bin下,这个ld-new就是关键,执行下面操作:
#mv-v/toolchain/bin/{ld,ld-old}
#mv-v/toolchain/$(gcc-dumpmachine)/bin/{ld,ld-old}
#mv-v/toolchain/bin/{ld-new,ld}
#ln-sv/toolchain/bin/ld/toolchain/$(gcc-dumpmachine)/bin/ld
这就使得接下来创建的程序都使用/toolchain/lib中的程序库了。
可是为什么要现在才作上述
操作呢?
因为在这之前,glibc还没有被创建,/toolchain/lib还不存在。
连接器搞定了,编译器还不行呢。
这里我要多说几句。
程序库分为两种,即静态库和动态
库。
静态库就是在程序在被创建时由连接器确认它们的关系,并将它们组合在了一起成为一个
整体;
动态库则不同,是在程序运行时,由动态连接器确认它们之间关系,它们是完全独立的
个体。
这里不要将连接器和动态连接器弄混了,连接器是binutils提供的ld程序,而动态连接
器则是glibc提供的。
连接器的名称通常是ld-linux.so.2,在不怎么流行的平台上则可能是
ld.so.1,而在新的64位平台上更可能是别的完全不同的名称。
为什么这时候编译器还不行呢?
因为编译器为了创建不同的程序,即要使用连接器也要使用动态连接器,所以要还要告诉编译
器动态连接器在哪里。
现在的这个gcc还只是知道你所用系统的动态连接器的位置,你现在应
该告诉他新的在哪里。
这是通过gcc的specs文件完成的。
通过下面的指令来产生gcc的specs文件:
#gcc-dumpspecs>
`dirname$(gcc-print-libgcc-file-name)`/specs
直接将specs文件放入了它所起作用的位置。
可以执行下面的命令获得这个路径:
#dirname$(gcc-printf-libgcc-file-name)
打开spces文件,修改所有类似“/lib/ld-linux.so.2”内容为
“/toolchain/lib/ld-linux.so.2”。
你可以用任何你熟悉的方式作,我有一个简单的方法如
下:
#gcc-dumpspecs|sed'
s@/lib/ld-linux.so.2@/tools&
@g'
\
>
这几个程序简单的组合,利用管道和输出从定向机制,就完成了所有的操作。
这就是类Unix系
统的精髓与魅力所在,各位读者体会一下,如果想了解更多Unix精髓,建议看一下《Unix编程
艺术》一书。
动态连接器问题解决了,还有一些麻烦问题需要处理,要不然,这个新的gcc环境还是对你
现在运行的系统有关系,因为gcc的fixincludes脚本在创建gcc的过程中,由于某些原因把你系
统里的头文件复制给这个新的gcc环境中去了。
这就是好心办坏事,不过不用担心,是有办法挽
救的。
执行下面的命令会将fixincludes产生的影响处理掉,当然,如果fixincludes没有帮倒
忙,下面的命令也不会作坏事,破坏这个新生的gcc环境:
#GCC_INCLUDEDIR=`dirname$(gcc-print-libgcc-file-name)`/include
#find${GCC_INCLUDEDIR}/*-maxdepth0-xtyped-execrm-rvf'
{}'
\;
#rm-vf`grep-l"
DONOTEDITTHISFILE"
${GCC_INCLUDEDIR}/*`
#unsetGCC_INCLUDEDIR
这下好了,马上检测一下:
如果你能看到如下结果就证明成功了:
如果没看到这样的结果,没办法了,从新创建gcc吧。
注意查看一下你现在的PATH环境变量,是
否与“准备环境”一节相符。
最后,应该收一下尾了。
#rm-vttt.ca.out
2.5继续工作
这个时候你的全新的gcc环境可以工作了,但是我们前面说过,还需要再创建一次binutils
和gcc,这是因为你的binutils和c编译器还没有脱离你现有的系统,同时gcc也只支持c编译,
只是临时的过度产物。
现在就要开始真正的工作了,这次创建的binutils和gcc真正的与你的系
统脱离了,而且你要用它们来完成接下来很多重要程序的创建工作。
这次的创建如此之重要,你需要保证创建完成的binutils
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Magic Linux开发入门指南 Linux 开发 入门 指南