Liuw's Thinkpad

想要赢就先学会输,想要成功就先学会失败

Archive for the ‘cross compile’ tag

为ASUS WL-520GU交叉编译ruijieclient

without comments

一个很悲剧的事情是,上一篇文章中提到的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好用点吧。

Written by liuw

March 17th, 2011 at 4:20 pm

Posted in Tech

Tagged with , , , ,

locale惹的祸

without comments

换了一台新机器去做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,不是说崇洋媚外不喜欢中文,要是遇到我今天的情况,估计还是挺恶心的,看着满版的错误,挺郁闷的。

Written by liuw

June 15th, 2010 at 12:28 am

Posted in Programming,UNIX-like

Tagged with , , ,