OpenHarmony移植tcpdump

本文主要介绍如何在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地址和路由并未发生改变,则不应执行删除动作。具体的修改代码这里就不贴出来了。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值