IPv6中的路由通告(router advertisement)在linux操作系统中为radvd模块,现在要在arm平台上实现IPv6的路由通告。要将radvd模块移植到arm平台上。在移植的过程中,遇到了N多问题,不过在我两位伟大师姐的指导下,经过几天的摆弄还是终于搞定了(O(∩_∩)O~)。下面将我的移植过程写下了,总结一下一边以后再次查看,也希望对需要的人提供一些帮助。多说一句感谢Google,现在才意识到Google推出中国市场是多么可惜,不过还好还能够使用它。
第一步:下载radvd源代码
下载网址:http://www.litech.org/radvd/
我下载的radvd-1.6-1.src.rpm源码包。在linux系统中运行
tar zxvf radvd-XXX.src.rpm 命令解压源码包,进入到解压后的目录当中去。源代码当中并没有Makefile有的是一个configure脚本文件。此类源代码是通过运行configure脚本文件后进行一些配置后。自动生成Makefile文件。此类源代码的安装步骤为:
configure 配置
make 编译
make install 安装
make uninstall 卸载
第二步:对源码包进行配置
运行:./configure --host=arm-linux CC=arm-linux-gcc
对于交叉编译运行configure脚本文件时要跟上适当的参数。必须要跟的为:“—host=arm-linux”运行configure脚本文件时,会进行一些了的checking注意检查其中的build、host、target。build后面应该为你主机(如果是虚拟机则为虚拟机)的linux操作系统的信息为:i686-pc-linux-gnu。host和target为arm-unknown-linux-gnu。还有就是检查 checking cross compile选项一定要为yes,表示在编译过程中进行的是交叉编译。Checking arm-linux-gcc 为arm-linux-gcc表示在进行交叉编译时使用的编译器为arm-linux-gcc。如果上述信息都正确则说明下面的编译过程中进行的就是交叉编译了。但在编译过程中遇到了麻烦,痛苦了我好几天。稍后细说。
注意:在源码包中有几个文件要在进行配置和交叉编译前看看。一个是运行configure –help命令查看configure的各个选项的意义和使用方法,这可以在进行交叉编译的时候给你一些帮助,比方说—host是什么意思,help中将的很明白。除此之外还有很多选型。其次就是源代码中的README 。如果在配置过程中如果出现错误可以查看config.log文件,在编译过程中如果出现错误产看该文件也会得到一些帮助。
第三步:编译源代码make
在进行编译的过程中,真是把我给弄无语了。本来就没经验,碰到一些问题都不知道是怎么回事。也不知道该去如何解决。
接下来是最重要的一步了——编译!如果configure过程中的checking过程都没什么打的问题,没有报错那就可以了!运行configure脚本文件后你会看到在源代码包中多了不少的文件,其中就有我们需要的Makefile文件。看看吧,呵呵。
好了运行 “make”命令:
问题来了:make过程中出项的warning先不去管它,让人头痛的是出现了错误推出了编译过程,错误类型为: “can not find –lfl”
不知道是怎么回事!头痛啊!差点因为它就放弃了,还好有师姐在,经他高明指点问题还是被我一步步的解决了。
解决:到网上去搜-lfl是个什么东西,结果得到的结果是——-lfl:要flex库。经过师姐的指点。终于知道编译过程中出错时因为缺少相应的库这里也就是flex库了。那就到网上去下载flex库加载到交叉编译环境中去。
注意:这里用到的是交叉编译,所以加载进去的flex库也要是进行交叉编译后的库文件。否则的话在编译的过程中还是找不到这个库。
下载网址:http://download.chinaunix.net/download/0004000/3101.shtml 下载flex的源码包 ,解压后进入源代码目录。看到跟radvd一样的文件结构有configure脚本文件,同样运行configure文件,但是在其后加入的—host=arm-linux似乎是没有起到作用。所用的编译器仍然是gcc,不过没关系,在运行configure脚本文件后找到生成的Makefile文件直接到里面去修改就可以了。找到CC=gcc行,将编译器改为arm-linux-gcc就ok了。下面开始编译,同样执行make。马克过后就可以看一个libfl.a文件。将libfl.a放到交叉编译环境下还是出现同样的错误,没办法只好回头去看config.log文件了。但是没看出什么问题。经师姐指点,知道要通过.a文件生成.so文件才可以。
到网上去找怎样.o生成.so的方法吧。功夫不负有心人人啊,找到了:http://osdir.com/ml/linux.lfs.hardened/2008-07/msg00063.html 我采用其中的第二种方法:
or put libfl.a in a separate directory.
ar -x libfl.a to extract the objects from the archive
gcc -shared *.o -o libfl.so to build the shared lib.
> and then take care of the symlinkage:
>
> cp -v libfl.so.$version /lib/
> ln -vsf libfl.so.$version /lib/libfl.so.2
> ln -vsf libfl.so.2 /lib/libfl.so
将生成的动态链接库libfl.so文件拷贝到交叉编译环境中的响应位置上。说实话我不知道这个文件该放到什么地方,我想了一个办法就是在交叉编译环境下的目录中去找.so文件都放到什么地方,结果搜到了。发现所有以lib开头的.so文件都放在同一个目录下,而且还有同名的.o文件。根据我的推断将生成的动态链接库文件发到响应的目录下。
再次在radvd的目录下运行make命令,开始编译了,期间给出不少的警告我没去管他。等到最后编译终于成功了。找到了我需要的可执行文件:radvd和radvdump。为了他们两折腾了我好几天,总算把它弄出来了。接下来的问题就好办多了。