iptables 版本选择 1.4.0, 高版本出现没有入口函数问题, 稍后解决。
下载地址:
http://www.netfilter.org/projects/iptables/downloads.html
选择源码iptables-1.4.0.tar.bz2。
解压缩命令:tar -xjvf iptables-1.4.0.tar.bz2.
编译命令:make CC=arm-none-linux-gnueabi-gcc RANLIB=arm-none-linux-gnueabi-ranlib AR=arm-none-linux-gnueabi-ar LD=arm-none-linux-gnueabi-ld
1 出现下面问题:
arm-none-linux-gnueabi-gcc -O2 -Wall -Wunused -I"/lib/modules/2.6.18-8.el5/build"/include -I"/lib/modules/2.6.18-8.el5/source"/include -Iinclude/ -DIPTABLES_VERSION=\"1.4.0\" -DIPT_LIB_DIR=\"/usr/local/lib/iptables\" -rdynamic -o iptables iptables-standalone.c iptables.o xtables.o libiptc/libiptc.a -ldl
/AT91SAM9X25/arm-2010q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/ld: libiptc/libiptc.a(libip4tc.o): Relocations in generic ELF (EM: 3)
/AT91SAM9X25/arm-2010q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/ld: libiptc/libiptc.a(libip4tc.o): Relocations in generic ELF (EM: 3)
libiptc/libiptc.a: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
由于在编译过程中 make libiptc子目录中的静态库不是用arm编译器编译出来的,在链接的时候提示格式不识别。
进入到libiptc目录修改makefile,
在libiptc/libip4tc.d libiptc/libip6tc.d: %.d: %.c
@-$(CC) -M -MG $(CFLAGS) $< | sed -e 's@^.*\.o:@$*.d libiptc/libiptc.a($*.o):@' > $@
之前添加以下语句:
CC=arm-none-linux-gnueabi-gcc
删除libiptc.a 回到主目录重新编译。
2 出现下面问题:
libiptc/libip6tc.c:123: error: 'const struct in6_addr' has no member named 'in6_u'
libiptc/libip6tc.c:127: error: 'const struct in6_addr' has no member named 'in6_u'
由于编译使用linux版本同iptables-1.4.0.tar.bz2。当是依赖版本不同,作出如下修改:
将'in6_u'前加上双下划线。将u6_addr32前面加上双下滑线。回主目录重新编译。
3 出现如下问题:
ip6tables.c:681: error: 'struct in6_addr' has no member named 'in6_u'
ip6tables.c:681: error: 'struct in6_addr' has no member named 'in6_u'
修改方式同上。继续编译完成。
4 安装:
可以在编译时执行PREFIX变量为安装路径。
或者在makefle中修改PREFIX值。
lib/iptables下库文件需要安装在lib/iptables目录下。
sbin下面存放iptables可执行程序。