交叉编译 tcpdump & libpcap
tcpdump 是一个强大的命令行包分析器,libpcap 是一个可移植的用于网络流量捕获的 C/C++ 库。tcpdump 依赖于 libpcap 库,同属于 tcpdump 项目。
交叉编译 tcpdump & libpcap
概述
tcpdump 是一个强大的命令行包分析器,libpcap 是一个可移植的用于网络流量捕获的 C/C++ 库。tcpdump 依赖于 libpcap 库,同属于 tcpdump 项目。
官方网址: https://www.tcpdump.org
源码下载
在官方网址的「Latest Releases」章节,显示了已发布的最新的版本信息及下载链接,可以通过点击「Download」链接进行下载。如下图所示:
wget https://www.tcpdump.org/release/tcpdump-4.99.4.tar.xz
wget https://www.tcpdump.org/release/libpcap-1.10.4.tar.xz
同时在官方网址的「Current Development Versions」章节,当前的开发版本可以通过 GitHub 托管站点(tcpdump、libpcap)免费访问。您可以使用以下命令克隆这些存储库:
git clone https://github.com/the-tcpdump-group/tcpdump
git clone https://github.com/the-tcpdump-group/libpcap
交叉编译 libpcap
解压缩源码包,如果使用 git clone
克隆回来的源码可以忽略这一步。
tar -xvf libpcap-1.10.4.tar.xz
解压缩源码包之后建议先阅读 README.md 与 INSTALL.md 文档,里面有关于编译的相关信息。
libpcap 支持 configure
脚本与 make
编译系统,同时也支持 CMake 编译系统,在本示例中,使用 configure
脚本进行编译。
首先创建一个环境配置文件 aarch64-environment-setup
,配置最重要的交叉编译环境变量:
aarch64-environment-setup:
export TOOLCHAIN_ROOT=/opt/toolchains/aarch64--glibc--stable-2022.03-1
export BUILDSYSROOT=$TOOLCHAIN_ROOT/aarch64-buildroot-linux-gnu/sysroot
export PATH=$TOOLCHAIN_ROOT/bin:$PATH
export PREFIX=/usr
export CC="aarch64-linux-gcc --sysroot=$BUILDSYSROOT"
export CXX="aarch64-linux-g++ --sysroot=$BUILDSYSROOT"
export CPP="aarch64-linux-gcc -E --sysroot=$BUILDSYSROOT"
export LD="aarch64-linux-ld --sysroot=$BUILDSYSROOT"
export AR=aarch64-linux-ar
export AS=aarch64-linux-as
export NM=aarch64-linux-nm
export GDB=aarch64-linux-gdb
export OBJDUMP=aarch64-linux-objdump
export OBJCOPY=aarch64-linux-objcopy
export RANLIB=aarch64-linux-ranlib
export READELF=aarch64-linux-readelf
export STRIP=aarch64-linux-strip
export CONFIGURE_FLAGS="--host=aarch64-linux --build=x86_64-linux"
export PKG_CONFIG_SYSROOT_DIR=$BUILDSYSROOT
export PKG_CONFIG_PATH=$BUILDSYSROOT/usr/lib/pkgconfig:$BUILDSYSROOT/usr/share/pkgconfig
在本示例中,交叉编译工具位于 /opt/toolchains/aarch64--glibc--stable-2022.03-1/bin
目录下,将该目录配置到 PATH 环境变量,让系统能够正确搜索到。同时在配置 CC,CXX,CPP 与 LD 环境变量时指定 --sysroot=<dir>
参数让交叉编译器搜索 dir 目录下的头文件与库文件,而不是 /usr/include
及 /usr/lib
。
cd libpcap-1.10.4
source aarch64-environment-setup
./configure --prefix=/usr $CONFIGURE_FLAGS
make
make DESTDIR=$BUILDSYSROOT install
- 源码包解压后,使用
cd
命令切换到源码路径 - 在源码目录下创建环境设置文件并调用
source
命令让环境变量生效 - 执行源码包的
configure
文件,带上--prefix
参数,指定安装路径。在配置文件中定义了临时的 CONFIGURE_FLAGS 来指定--host
与--build
选项的值,具体的说明可以使用./configure --help
命令进行查阅 - 执行
make
命令编译源码 - 使用 DESTDIR 参数作为安装目标文件的前缀变量,后面带上你希望安装到的文件夹路径,更详细介绍可以参考 DESTDIR 官方介绍,也可以参考我的博文《交叉编译 libcap》关于 DESTDIR 的用法说明。
最终你就可以在环境变量定义的 $BUILDSYSROOT
目录中找到交叉编译好的 libpcap 的头文件及库文件。Good luck.
交叉编译 tcpdump
解压缩源码包,如果使用 git clone
克隆回来的源码可以忽略这一步。
tar -xvf tcpdump-4.99.4.tar.xz
解压缩源码包之后建议先阅读 README.md 与 INSTALL.md 文档,里面有关于编译的相关信息。
tcpdump 使用的是 GNU Build System,也就是经典的 unix 编译三部曲:configure
, make
, make install
。
首先创建一个环境配置文件 aarch64-environment-setup
,配置最重要的交叉编译环境变量:
aarch64-environment-setup:
export TOOLCHAIN_ROOT=/opt/toolchains/aarch64--glibc--stable-2022.03-1
export BUILDSYSROOT=$TOOLCHAIN_ROOT/aarch64-buildroot-linux-gnu/sysroot
export PATH=$TOOLCHAIN_ROOT/bin:$PATH
export PREFIX=/usr
export CC="aarch64-linux-gcc --sysroot=$BUILDSYSROOT"
export CXX="aarch64-linux-g++ --sysroot=$BUILDSYSROOT"
export CPP="aarch64-linux-gcc -E --sysroot=$BUILDSYSROOT"
export LD="aarch64-linux-ld --sysroot=$BUILDSYSROOT"
export AR=aarch64-linux-ar
export AS=aarch64-linux-as
export NM=aarch64-linux-nm
export GDB=aarch64-linux-gdb
export OBJDUMP=aarch64-linux-objdump
export OBJCOPY=aarch64-linux-objcopy
export RANLIB=aarch64-linux-ranlib
export READELF=aarch64-linux-readelf
export STRIP=aarch64-linux-strip
export CONFIGURE_FLAGS="--host=aarch64-linux --build=x86_64-linux"
export PKG_CONFIG_SYSROOT_DIR=$BUILDSYSROOT
export PKG_CONFIG_PATH=$BUILDSYSROOT/usr/lib/pkgconfig:$BUILDSYSROOT/usr/share/pkgconfig
在本示例中,交叉编译工具位于 /opt/toolchains/aarch64--glibc--stable-2022.03-1/bin
目录下,将该目录配置到 PATH 环境变量,让系统能够正确搜索到。同时在配置 CC,CXX,CPP 与 LD 环境变量时指定 --sysroot=<dir>
参数让交叉编译器搜索 dir 目录下的头文件与库文件,而不是 /usr/include
及 /usr/lib
。
cd tcpdump-4.99.4
source aarch64-environment-setup
./configure --prefix=/usr $CONFIGURE_FLAGS LIBS=-lpthread
make
make DESTDIR=/tmp/sysroot install
- 源码包解压后,使用
cd
命令切换到源码路径 - 在源码目录下创建环境设置文件并调用
source
命令让环境变量生效 - 执行源码包的
configure
文件,带上--prefix
参数,指定安装路径。在配置文件中定义了临时的 CONFIGURE_FLAGS 来指定--host
与--build
选项的值,具体的说明可以使用./configure --help
命令进行查阅 - 执行
make
命令编译源码 - 使用 DESTDIR 参数作为安装目标文件的前缀变量,后面带上你希望安装到的文件夹路径,更详细介绍可以参考 DESTDIR 官方介绍,也可以参考我的博文《交叉编译 libcap》关于 DESTDIR 的用法说明。
注意: 比较特别的地方是在于 tcpdump 在 Linux 的编译需要指定
LIBS=-lpthread
,否则在执行make
的过程中会出现undefined reference to 'pthread_create'
的报错。
最终你就可以在 /tmp/sysroot
目录中找到交叉编译好的 tcpdump 二进制文件。Good luck.
欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)