本文主要介绍如何在OpenHarmony系统下交叉编译tcpdump工具。
tcpdump官方下载渠道:https://www.tcpdump.org/#latest-releases
主要依赖libpcap,如果需要支持RFMON模式的话,libpcap还需要依赖libnl。
交叉编译libnl
https://www.linuxfromscratch.org/blfs/view/svn/basicnet/libnl.html
源码下载和解压:
wget https://github.com/thom311/libnl/releases/download/libnl3_9_0/libnl-3.9.0.tar.gz
tar -xvf libnl-3.9.0.tar.gz
cd libnl-3.9.0/
编译脚本build.sh:
#!/bin/bash
set -e
if [ "$1" == "clean" ] || [ "$1" == "distclean" ];then
make $1
exit 0
fi
compile_mode=static
if [ "$1" == "static" ];then
compile_mode=static
elif [ "$1" == "shared" ];then
compile_mode=shared
fi
export OHOS_SDK_HONE=/opt/sdk/ohos
export OHOS_NATIVE_HOME=/opt/sdk/ohos/native/4.0.10.13
export PATH=$OHOS_NATIVE_HOME/llvm/bin:$PATH
export AR=$OHOS_NATIVE_HOME/llvm/bin/llvm-ar
export AS=$OHOS_NATIVE_HOME/llvm/bin/llvm-as
export LD=$OHOS_NATIVE_HOME/llvm/bin/ld.lld
export RANLIB=$OHOS_NATIVE_HOME/llvm/bin/llvm-ranlib
export STRIP=$OHOS_NATIVE_HOME/llvm/bin/llvm-strip
export CC="$OHOS_NATIVE_HOME/llvm/bin/clang"
export NM="$OHOS_NATIVE_HOME/llvm/bin/llvm-nm"
export OBJDUMP="$OHOS_NATIVE_HOME/llvm/bin/llvm-objdump"
export CFLAGS="--target=arm-linux-ohos --sysroot=$OHOS_NATIVE_HOME/sysroot -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -mfpu=neon -funwind-tables -fstack-protector -fno-strict-aliasing -fPIC"
export CPPFLAGS="--target=arm-linux-ohos --sysroot=$OHOS_NATIVE_HOME/sysroot -fPIC"
export LDFLAGS="--target=arm-linux-ohos --rtlib=compiler-rt -fuse-ld=lld"
export LIBS="-lunwind"
EXTOPTS=""
# static compile, maybe we need disable shared library
if [ "$compile_mode" == "static" ];then
#EXTOPTS="--disable-shared"
EXTOPTS=""
fi
./configure --prefix=${PWD}/_install \
--target=arm-linux-ohos \
--host=arm-linux \
${EXTOPTS}
sed -i 's/archive_cmds="\\$CC -shared \\$pic_flag/archive_cmds="\\$CC -shared --target=arm-linux-ohos \\$pic_flag/g' ./libtool
make && make install
这里链接动态库的时候调用的是自动生成的libtool脚本,clang命令下需要增加–target=arm-linux-ohos选项,否则链接时会报ELF头不匹配的错误。
执行编译脚本:
bash build.sh distclean;bash build.sh
交叉编译libpcap
https://www.linuxfromscratch.org/blfs/view/svn/basicnet/libpcap.html
源码下载和解压:
wget https://www.tcpdump.org/release/libpcap-1.10.4.tar.gz
tar -xf libpcap-1.10.4.tar.gz
cd libpcap-1.10.4/
编译脚本build.sh:
#!/bin/bash
set -e
if [ "$1" == "clean" ] || [ "$1" == "distclean" ];then
make $1
exit 0
fi
compile_mode=static
if [ "$1" == "static" ];then
compile_mode=static
elif [ "$1" == "shared" ];then
compile_mode=shared
fi
export OHOS_SDK_HONE=/opt/sdk/ohos
export OHOS_NATIVE_HOME=/opt/sdk/ohos/native/4.0.10.13
export PATH=$OHOS_NATIVE_HOME/llvm/bin:$PATH
export AR=$OHOS_NATIVE_HOME/llvm/bin/llvm-ar
export AS=$OHOS_NATIVE_HOME/llvm/bin/llvm-as
export LD=$OHOS_NATIVE_HOME/llvm/bin/ld.lld
export RANLIB=$OHOS_NATIVE_HOME/llvm/bin/llvm-ranlib
export STRIP=$OHOS_NATIVE_HOME/llvm/bin/llvm-strip
export CC="$OHOS_NATIVE_HOME/llvm/bin/clang"
export NM="$OHOS_NATIVE_HOME/llvm/bin/llvm-nm"
export OBJDUMP="$OHOS_NATIVE_HOME/llvm/bin/llvm-objdump"
export CFLAGS="--target=arm-linux-ohos --sysroot=$OHOS_NATIVE_HOME/sysroot -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -mfpu=neon -funwind-tables -fstack-protector -fno-strict-aliasing -D__MUSL__ -I${PWD}/../libnl-3.9.0/_install/include/libnl3"
export CPPFLAGS="--target=arm-linux-ohos --sysroot=$OHOS_NATIVE_HOME/sysroot -D__MUSL__"
export LDFLAGS="--target=arm-linux-ohos --rtlib=compiler-rt -fuse-ld=lld"
export LIBS="-lunwind"
./configure --prefix=${PWD}/_install \
--target=arm-linux-ohos \
--host=arm-linux \
--with-pcap=linux \
--with-libnl=${PWD}/../libnl-3.9.0/_install
# static compile, link the static library libnl-genl-3.a and libnl-3.a
if [ "$compile_mode" == "static" ];then
sed -i 's%-lnl-genl-3%../libnl-3.9.0/_install/lib/libnl-genl-3.a%g' ./Makefile
sed -i 's%-lnl-3%../libnl-3.9.0/_install/lib/libnl-3.a%g' ./Makefile
fi
make && make install
# script pcap-config generated by make install
if [ "$compile_mode" == "static" ];then
sed -i 's%-lnl-genl-3%'${PWD}'/../libnl-3.9.0/_install/lib/libnl-genl-3.a%g' ./pcap-config
sed -i 's%-lnl-3%'${PWD}'/../libnl-3.9.0/_install/lib/libnl-3.a%g' ./pcap-config
fi
这里如果需要静态方式来链接libnl的库的话,需要修改一下Makefile以及pcap-config文件。
执行编译脚本:
bash build.sh distclean;bash build.sh
交叉编译tcpdump
https://www.tcpdump.org/#latest-releases
源码下载和解压:
wget https://www.tcpdump.org/release/tcpdump-4.99.4.tar.gz
tar -xf tcpdump-4.99.4.tar.gz
cd tcpdump-4.99.4/
编译脚本build.sh:
#!/bin/bash
set -e
if [ "$1" == "clean" ] || [ "$1" == "distclean" ];then
make $1
exit 0
fi
compile_mode=static
if [ "$1" == "static" ];then
compile_mode=static
elif [ "$1" == "shared" ];then
compile_mode=shared
fi
export OHOS_SDK_HONE=/opt/sdk/ohos
export OHOS_NATIVE_HOME=/opt/sdk/ohos/native/4.0.10.13
export PATH=$OHOS_NATIVE_HOME/llvm/bin:$PATH
export AR=$OHOS_NATIVE_HOME/llvm/bin/llvm-ar
export AS=$OHOS_NATIVE_HOME/llvm/bin/llvm-as
export LD=$OHOS_NATIVE_HOME/llvm/bin/ld.lld
export RANLIB=$OHOS_NATIVE_HOME/llvm/bin/llvm-ranlib
export STRIP=$OHOS_NATIVE_HOME/llvm/bin/llvm-strip
export CC="$OHOS_NATIVE_HOME/llvm/bin/clang"
export NM="$OHOS_NATIVE_HOME/llvm/bin/llvm-nm"
export OBJDUMP="$OHOS_NATIVE_HOME/llvm/bin/llvm-objdump"
export CFLAGS="--target=arm-linux-ohos --sysroot=$OHOS_NATIVE_HOME/sysroot -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -mfpu=neon -funwind-tables -fstack-protector -fno-strict-aliasing -D__MUSL__"
export CPPFLAGS="--target=arm-linux-ohos --sysroot=$OHOS_NATIVE_HOME/sysroot -D__MUSL__"
export LDFLAGS="--target=arm-linux-ohos --rtlib=compiler-rt -fuse-ld=lld"
EXTOPTS=""
#EXTOPTS="--disable-local-libpcap"
./configure --prefix=${PWD}/_install \
--target=arm-linux-ohos \
--host=arm-linux \
${EXTOPTS}
# static compile, link the static library libnl-genl-3.a and libnl-3.a
#if [ "$compile_mode" == "static" ];then
# sed -i 's%-lnl-genl-3%../libnl-3.9.0/_install/lib/libnl-genl-3.a%g' ./Makefile
# sed -i 's%-lnl-3%../libnl-3.9.0/_install/lib/libnl-3.a%g' ./Makefile
#fi
make && make install
编译tcpdump的时候,会自动去上一级目录下的libpcap-1.10.4目录中查找并执行pcap-config文件,即…/libpcap-1.10.4/pcap-config,获取链接选项。编译libpcap时修改了pcap-config脚本的话,编译tcpdump时就不需要修改Makefile了。
执行编译脚本:
bash build.sh distclean;bash build.sh
OpenHarmony 4.0 Release(4.0.10.13)版本下网络管理服务针对以太网的处理存在BUG。tcpdump执行时会触发内核上报以太网网络接口的状态(通过ip monitor我们可以监测到link up的通知,对比Android系统的行为一致),网络管理服务收到通知之后会更新该接口的信息。针对IP地址和路由的处理,会先清空旧的IP地址和路由,然后重新设置,会导致以太网网络短暂断开。所以,如果在SSH会话下执行tcpdump命令时,SSH会话会立即退出,其他网络通信的场景也会被打断。解决方案就是修改网络管理器中更新IP地址和路由的逻辑,如果新的IP地址和路由并未发生改变,则不应执行删除动作。具体的修改代码这里就不贴出来了。