Feb 28
当然,前提是不缺胳膊少腿、功能正常。

主要是从这两个方面入手:

1. 使用动态库,这是默认的,只要在编译的时候不加上 -static 参数就行了
2. 去处不必要的.symbol和.debug的信息,在编译的时候加上-s参数即可;或者在编译以后运行strip a.out。

strip能清除执行文件中不必要的标示符及调试信息
可减小文件大小而不影响正常使用,但是不能调试了
所以用于不需要调试的场合
Feb 25

Tomato的日志 不指定

felix021 @ 2009-2-25 20:46 [IT » 硬件] 评论(0) , 引用(0) , 阅读(5066) | Via 本站原创
看了一下日志,还挺有意思,不过最后有点小可怕:bad swap file。
于是赶紧还是把swap关掉,就用ram。
看来升级RAM才是王道阿,改天和feli一起去淘内存颗粒。
--
Jan  1 08:00:12 wl-520gu syslog.info syslogd started: BusyBox v1.12.3
Jan  1 08:00:12 wl-520gu authpriv.info dropbear[113]: Running in background
Jan  1 08:00:12 wl-520gu user.notice kernel: klogd started: BusyBox v1.12.3 (2009-02-10 00:46:12 EST)
Jan  1 08:00:12 wl-520gu user.warn kernel: CPU revision is: 00029029
Jan  1 08:00:12 wl-520gu user.warn kernel: Primary instruction cache 16kb, linesize 16 bytes (4 ways)
Jan  1 08:00:12 wl-520gu user.warn kernel: Primary data cache 16kb, linesize 16 bytes (2 ways)
Jan  1 08:00:12 wl-520gu user.warn kernel: Linux version 2.4.20 (root@tomato) (gcc version 3.2.3 with Broadcom modifications) #2 Tue Feb 10 00:53:58 EST 2009
Feb 25

How To Read C Declarations 不指定

felix021 @ 2009-2-25 16:02 [IT » 程序设计] 评论(1) , 引用(0) , 阅读(7270) | Via 本站原创
这篇看起来忒有意思,回头有空了我翻译一下。

How To Read C Declarations

zz from http://blog.chinaunix.net/u1/36290/showart_443799.html

Even experienced C programmers have difficulty reading declarations that go beyond simple arrays and pointers. For example, is the following an array of pointers or a pointer to an array?
int *a[10];

What the heck does the following mean?
int (*(*vtable)[])();

Naturally, it's a pointer to an array of pointers to functions returning integers. ;)

This short article tells you how to read any C declaration correctly using a very simple technique. I am 99% certain that I read this in a book in the late 1980s, but I can't remember where. I doubt that I discovered this on my own (even though I've always been delighted by computer language structure and esoterica). I do remember, however, building a simple program that would translate any declaration into English.
The golden rule

The rule goes like this:
引用
    "Start at the variable name (or innermost construct if no identifier is present. Look right without jumping over a right parenthesis; say what you see. Look left again without jumping over a parenthesis; say what you see. Jump out a level of parentheses if any. Look right; say what you see. Look left; say what you see. Continue in this manner until you say the variable type or return type."

The degenerate case is:
Feb 24

域名又被处理了 不指定

felix021 @ 2009-2-24 18:44 [IT » 网络] 评论(0) , 引用(0) , 阅读(3594) | Via 本站原创
www.felix021.com 这个域名被处理了,不能通过浏览器直接访问了,urlforwad到ctc.felix021.com
由于meyu的邮件里面说到,不影响搜索引擎收录,所以这么测试了一下,还挺有意思
引用
felix021@felix021-laptop:~$ telnet www.felix021.com
Trying 211.136.108.72...
telnet: Unable to connect to remote host: Connection refused
felix021@felix021-laptop:~$ telnet www.felix021.com 80
Trying 211.136.108.72...
Connected to www.felix021.com.
Escape character is '^]'.
GET /index.php HTTP/1.1
Host: www.felix021.com
User-agent: MSIE

HTTP/1.0 302 Moved Temporarily
Server: squid
Date: Tue, 24 Feb 2009 09:15:20 GMT
Content-Type: text/html
Content-Length: 0
Expires: Tue, 24 Feb 2009 09:15:20 GMT
Location: http://67.213.219.111/beian.html
X-Squid-Error: 403 Access Denied
X-Cache: MISS from domain123.com
Via: 1.0 domain123.com:80 (squid)
Connection: close

Connection closed by foreign host.

引用
$ felix021@felix021-laptop:~$ telnet www.felix021.com 80
Trying 211.136.108.72...
Connected to www.felix021.com.
Escape character is '^]'.
GET /index.php HTTP/1.1
Host: www.felix021.com
User-agent: baiduspider(http://www.baidu.com/)

HTTP/1.0 200 OK
Date: Tue, 24 Feb 2009 09:14:29 GMT
Server: Apache/2
X-Powered-By: PHP/5.2.5
Vary: Accept-Encoding,User-Agent
Content-Length: 1040
Content-Type: text/html
X-Cache: MISS from domain123.com
Via: 1.0 domain123.com:80 (squid)
Connection: close

~~然后是index.php的内容,不贴了~~
Feb 19
之前的那个因为在创建守护进程的那一部分代码没有写清楚
所以每次退出telnet就会退出,更新了一下
要编译好的版本可以从这里下载:
http://bbs.whu.edu.cn/bbscon.php?bid=50&id=19510
或者直接email我,我发过去,嗯。
因为静态编译的比较大,1.8MB(有没谁能搞个小的?我对编译选项不很了解,-Os没效果,汗)
所以如果各位想要去买路由器的话
1。建议至少买4MB Flash的产品,刷mini版本的
2。可以买2MB Flash的产品,但是要自己手动焊MMC/SD读卡器(据说很简单的)
3。最好是有USB口的,插上U盘就行,最省事了。
所以最实惠的选择还是我的ASUS WL-520GU,挖咔咔~~370+15运费,超划算的。
如果各位nb的话,还可以在上面安装BT,电驴,Web服务器(架BBS,如www.2cna.cn)
另外一款NB的是"64M超大内存贝尔金7231-4P 4M FLASH 带USB口脱机bt 电驴"
这个貌似比较便宜,就是难看了点儿,具体自己baidu吧~

Feb 19
发现以前在Linux下C编程入门里面看到的创建守护进程的办法不够完整,导致做好的东东在路由器的MIPS版Linux下面不能正常在后台运行,一旦退出telnet,进程也就跟着结束了。于是参考这篇文章做出了一个完整的版本,哦也!

zz from http://dev.csdn.net/article/42/42281.shtm

Linux 守护进程的编程方法

守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。 Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。
守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,造成不同 Unix环境下守护进程的编程规则并不一致。这需要读者注意,照搬某些书上的规则(特别是BSD4.3和低版本的System V)到Linux会出现错误的。下面将全面介绍Linux下守护进程的编程要点并给出详细实例。

一. 守护进程及其特性
Feb 19

异或交换技巧的陷阱 不指定

felix021 @ 2009-2-19 17:31 [IT » 程序设计] 评论(0) , 引用(0) , 阅读(3891) | Via 本站原创
众所皆知,以下代码可以实现两个变量的交换:
int a, b;
a = a ^ b;
b = a ^ b;
a = a ^ b;

于是用这个写了一个随机化快速排序(防止特殊情况下的算法退化,代码很简单,如果认识快排,应该不难读懂)
void qsort(int a[], int s, int e){
    int i = s, j = e, t, p;
    if (s < e){
        p = rand() % (e - s + 1) + s;
        a[s] ^= a[p], a[p] ^= a[s], a[s] ^= a[p];
        t = a[s];
        while(i != j){
            while(i < j && a[j] > t) j--;
            if(i < j) a[i++] = a[j];
            while(i < j && a[i] < t) i++;
            if(i < j) a[j--] = a[i];
        }
        a[i] = t;
        qsort(a, s, i - 1);
        qsort(a, i + 1, e);
    }
}

看起来不错,可是运行结果不对,为什么呢?
因为
Feb 19
@ 2010-05-29
我手头已经没有交叉编译工具链了,这个newstar,可能只适用于武大信息学部宿舍8栋,有问题估计帮不了忙了,真抱歉。
如果需要dd-wrt的,可以试试在这里的这个(tomato也许也能用呢):
http://www.right.com.cn/forum/viewthread.php?tid=29702&extra=page%3D2

-----
@ 2009-05-01
建议看看这篇文章:开源无线路由器固件上 Bug 的故事
http://blog.xiaoding.org/post/bug-story-on-open-source-routers-2.html
就是说,其实WL-520gu的交换芯片BCM5354是有个BUG的,如果使用多播协议的802.1x认证可能无法搞定。。。

-----

花了这么多天的时间,果然是值得阿!
寒假在家里搭建的buildroot确实可以交叉编译,但是编译出来的东西在路由器上不能运行!
于是很郁闷地看了不少资料,才发现,原来dd-wrt和tomato固件都是基于linux-2.4的,
但是寒假搭建的那个,linux内核直接down的是2.6.28....
反正是牛头不对马嘴了。
于是去下载openwrt提供buildroot来搭建交叉编译工具链。
说简单也很简单:
1. svn下来openwrt的buildroot
$ su
$ mkdir /cross
$ cd /cross
$ svn co svn://svn.openwrt.org/openwrt/branches/whiterussian/

2. 参照这篇 [在ubuntu8.10 下建立 ARM-Linux 交叉编译环境] 的内容进行如下修改:
1) 安装一些必须工具
  $ sudo apt-get install bison flex build-essential patch libncurses5-dev
2) 修改一些系统文件
  a)ubuntu的sh是链接到dash的,修改回bash
    $ cd /bin
    $ sudo ln -sf bash /bin/sh
  b)用用新立得软件包管理器安装gcc-4.1(自带的gcc4.3.2无法编译成功!但不用卸载),然后
    $ sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc  (gcc只是一个soft link,回头再链回到gcc-4.3就可以了)
      如果不安装gcc-4.1,就会出现2个问题:
    ~~ /usr/include/bits/fcntl2.h:51: error: call to '__open_missing_mode' declared with attribute error: open with O_CREAT in second argument needs 3 arguments
    编译到这里的时候提示这个错误,是因为没有第三个参数,gcc 4.3.2严格的语法检查不让通过;你可以修改 gcc-<版本号>/gcc/collect2.c的1575行附近,加上第三个参数0777,变成 redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT, 0777);  然后就可以继续编译
    ~~ 尽管可以继续编译,但是还会出现这个问题:*** buffer overflow detected ***: mipsel-9tdmi-linux-gnu-ar terminated
    哈,编译出来的这个程序根本就有问题!所以还是老老实实地安装gcc 4.1吧!

3) 安装配置
    $ cd whiterussian/openwrt
    $ make menuconfig
    应该不用选太多东西,不过libgcc, libpcap, uClibc++最好选上,因为编译newstar需要它们。

4) 开始搭建toolchain
    $ make
  安装过程中会需要下载n多个包,速度超慢,建议是开始下载的时候按下Ctrl+C,然后复制下载链接到迅雷下载,然后再copy到这个目录的dl目录下面

5) 不出意外,搭建好了!配置环境变量
    $ export PATH=$PATH:/cross/whiterussian/openwrt/staging_dir_mipsel/bin
    可以把这一行加入到.bashrc或者/etc/profile中,免得每次要编译都输入一遍:)

6) 下载这个newstar.mips.tar.gz (@2009-02-19 19:00修正了一个BUG)
   
下载文件 (已下载 1646 次)

    $ tar zxvf newstar_mips.tar.gz
    $ cd newstar.mips
    $ make
    如果有需要,可以修改feli_net.cpp里面的几个文件的路径,比如log,tmp,config。
    注意Makefile里面有个 ARG=-static,也就是这个是静态编译的,大小有1.8MB呢,不过反正我有个1G的U盘空间,无所谓——还是有个USB口来得好阿!

  7) 拷到路由器,配置运行
    $ telnet 192.168.1.1 //telnet到路由器的命令行下
    $ ./newstar config
    我用的asus wl-520gu,WAN网卡是vlan1,配置的时候interface填这个就OK!
    $ ./newstar


  8) 如果需要编译其他程序
    $ mipsel-linux-g++ -static hello.c -o hello.out

哦也哦也哦也!手机可以上校园网了!!!!!
 
分页: 1/2 第一页 1 2 下页 最后页 [ 显示模式: 摘要 | 列表 ]