最近研究了下如何在嵌入式设备上移植tcpdump的功能,tcpdump是一款款用来截取网络数据的工具,在嵌入式系统中常用来抓取和分析网络数据包。在这里我们着重讲下如何在嵌入式的系统中使用tcpdump。
1. 下载libpcap源码和tcpdump源码
可能有人会问,为什么要下载libpcap源码呢?我只是安装个tcpdump,不想安装libpcap啊。但其实你在安装tcpdump时就会发现,tcpdump的编译过程是基于libpcap提供的库文件进行操作的,这点也可以在tcpdump的configure文件中找到说明。
下载源码的链接地址:http://www.tcpdump.org/,这里我下载的版本是libpcap-libpcap-1.4.zip和tcpdump-tcpdump-4.4.0.zip。后面的操作都是基于这两个版本进行的。(注意:可能不同的版本操作方法可能有些不同,但主要流程是一样的)
2. 解压源码
将下载的源码解压到同一个目录下,这里我使用的目录是~/tcpdump/package/。使用解压命令:
unzip libpcap-libpcap-1.4.zip
unzip tcpdump-tcpdump-4.4.0.zip
3. 配置、编译、安装libpcap
由于libpcap和tcpdump的源码编译所需要的Makefile文件是由confirgure配置而自动生成的,因此需要先对源码进行配置,生成Makefile文件。
- 配置libpcap源码命令
./configure --prefix=/home/linux/tcpdump/tools --host=arm-xilinx-linux-gnueabi --target=arm-xilinx-linux-gnueabi CC=arm-xilinx-linux-gnueabi-gcc --with-pcap=linux
-
编译libpcap
make
-
安装libpcap
make install
编译成功后会在~/tcpdump/tools目录下生成三个个文件夹bin, include和lib;里面包含了libpcap的头文件, 库及配置信息。如果编译时提示arm-xilinx-linux-gnueabi-gcc不存在,那就修改下开发环境中的/etc/profile中的最后一行增加下你的交叉编译工具链的绝对路径:export PATH=$PATH:/work/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin
4. 配置、编译、安装tcpdump
- 配置tcpdump源码命令
./configure --prefix=/home/linux/tcpdump/tools --host=arm-xilinx-linux-gnueabi --target=arm-xilinx-linux-gnueabi CC=arm-xilinx-linux-gnueabi-gcc ac_cv_linux_vers=2
-
编译libpcap
make
-
安装libpcap
make install
编译完成后会在~/tcpdump/tools/sbin目录下找到独立的可执行文件tcpdump
这里需要说明的是CC参数指定了交叉编译器, 编译两者时需要指定相同的目录, 否则在编译tcpdump时需要指定libpcap的路径。
注意:tcpdump的源码必须要与libpcap源码放在同一个目录下,因为在配置tcpdump时,在configure文件中会检查libpcap文件,所以必须放在同一个目录下,而且文件名也是有要求的,必须是libpcap-xxx。如果libpcap文件夹的名称不是libpcap-xxx类型,就会报如下错误。在tcpdump文件的configure中,可以看到对文件名称的限制。
5. 运行
将编译好的tcpdump可执行文件下载到板卡上,可以直接利用tcpdump来抓取网络端口的数据包了。如果觉得编译出来的可执行文件较大,可以利用arm-xilinx-linux-gnueabi-strip tcpdump来进行瘦身。