Archive for the ‘cross compile’ tag
为ASUS WL-520GU交叉编译ruijieclient
一个很悲剧的事情是,上一篇文章中提到的toolchain,其实是用来编译内核的。真正应该用的是OpenWRT的SDK。所以先把OpenWRT的SDK搞下来。这个文章是事后所记,有点错漏在所难免。
$ svn co svn://svn.openwrt.org/openwrt/branches/8.09 $ make menuconfig $ make
menuconfig的时候也用不着选太多的东西。记得把libpcap选上(M还是*随意),ruijieclient会用到相关的头文件和库。
把cross compiler所在的目录加入到PATH变量中。
$ export PATH=$PATH:/PATH/TO/YOUR/8.09/staging_dir/toolchain-mipsel_gcc3.4.6/bin
假如用的是newstar,这里已经可以直接make了。
但是要编译ruijieclient还不行,因为ruijieclient用的是autoconf来生成Makefile,配置全面点,也麻烦点。
先把ruijieclient搞下来。
$ git clone git@github.com:microcai/ruijieclient.git $ cd ruijieclient $ ./autogen.sh
运行完之后会生成configure脚本文件。假如现在直接make CC=mipsel-linux-gcc的话,会报告找不到pcap.h的错误。而实际上pcap.h在toolchain中是有的,位于/PATH/TO/YOUR/8.09/staging_dir/mipsel/usr/include目录下。mipsel-linux-gcc的search path是在toolchain里面gcc的include目录下。所以先做点软链接。
$ cd /PATH/TO/YOUR/8.09/staging_dir/toolchain-mipsel_gcc3.4.6/include $ mkdir pcap $ cd pcap $ ln -s /PATH/TO/YOUR/8.09/staging_dir/mipsel/usr/include/pcap.h pcap.h $ cd .. $ ln -s /PATH/TO/YOUR/8.09/staging_dir/mipsel/usr/include/pcap-bpf.h pcap-bpf.h $ ln -s /PATH/TO/YOUR/8.09/staging_dir/mipsel/usr/include/pcap-namedb.h pcap-namedb.h
现在还不能做configure,因为只有头文件,没有pcap的archive或者shared object也是不行的。在编译SDK之后,SDK目录下的/PATH/TO/YOUR/8.09/build_dir/mipsel/libpcap-0.9.8目录下面会有生成的a文件和so文件,把它们拷贝到toolchain的lib目录下面。
最后用下面的configure来生成Makefile。
$ ./configure --host=mipsel-openwrt-linux-uclibc CC=mipsel-linux-gcc LD=mipsel-linux-ld AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib LDFLAGS=-lpcap
好了,现在终于成功生成Makefile了。真累啊。
那么make吧……不行,又出错了。ruijieclient是针对2.6内核写的,而SDK里面的内核还是2.4版本的。所以内核头文件也有不同。packetsender.c里面调用socket的时候用了SOCK_CLOEXEC标志,2.4里面没有。我觉得去掉也没问题的,因为这个程序不是多线程的,也不在连接后生成子进程。这个标志的具体含义自己看manpage去吧。
好了,现在make也通过了。生成的ruijieclient是dynamic linked的,也没有stripped掉。要static linked和strip的ruijieclient是很简单的。
接下来就是要到路由上测试程序能不能用了。之所以花这么多时间折腾这个,是觉得ruijieclient做得比较完善,希望会比原始的newstar好用点吧。
locale惹的祸
换了一台新机器去做TPM硬件驱动的开发,于是从远程仓库把代码clone下来。试着把代码编译一次,出问题了,满版的错误,费点时间看了一下,其实是stddef.h没有找到造成的。
新机器和原来的机器都是一样系统,工具链也是一样的,代码也已经在我原来的机器上编译通过了。用find找了一下stddef.h,在机器上也是有的。仔细对比了一下通过和不通过的CFLAGS,发现不通过的情况下,头文件路径中没有gcc的包含路径,问题就出在这里了。
再看Makefile,gcc路径是通过如下的方法取得的。
GCC_INSTALL = $(shell gcc --print-serarch-dirs | sed -n -e 's/install: \(.*\)/\1/p')
使用sed匹配了以install开头的行。
但是,我现在这个系统的locale是中文的,所以“install”没有出现,取而代之的是“安装”,匹配不成功,GCC_INSTALL就成了空值,那么也没有把路径加入。
追踪了半天,没想到是locale出了问题。因为我原来一直用的是英文系统,所以没有遇到过这种情况。所以以后装系统,最好还是用英文的locale,不是说崇洋媚外不喜欢中文,要是遇到我今天的情况,估计还是挺恶心的,看着满版的错误,挺郁闷的。