我们已经完成了openharmony(ohos_lite)移植tcpdump,参考
openharmony(ohos_lite)移植tcpdump
接下来我们只需要在这个基础上改造适配 rk3568即可。
1、产品引用:把子系统及其组件加入产品定义中,rk3568产品定义文件为
vendor/hihope/rk3568/config.json 添加 tcpdump
{
"subsystem": "thirdparty",
"components": [
{
"component": "libuv",
"features": [
"use_ffrt = true"
]
}
,{ "component": "tcpdump", "features":[ "" ] }
]
},
2、修改libpcap 的BUILD.gn 文件
config("common_config") {
cflags = [
"-fpic"
]
defines = [ "BUILDING_PCAP","pcap_EXPORTS","HAVE_CONFIG_H","_GNU_SOURCE"]
}
common_include_dirs = ["//third_party/libpcap"] #通过分析Makefile补充
libpcap_sources =[ ] #通过分析Makefile补充
PLATFORM_C_SRC = ["pcap-linux.c","fad-getad.c"]
MODULE_C_SRC = ["pcap-usb-linux.c","pcap-netfilter-linux.c"]
REMOTE_C_SRC =[]
COMMON_C_SRC =["pcap.c","gencode.c","optimize.c","nametoaddr.c","etherent.c"
,"fmtutils.c","pcap-util.c","savefile.c","sf-pcap.c","sf-pcapng.c"
,"pcap-common.c","pcap-usb-linux-common.c","bpf_image.c","bpf_filter.c","bpf_dump.c"]
GENERATED_C_SRC = ["scanner.c","grammar.c"]
libpcap_sources +=PLATFORM_C_SRC
libpcap_sources +=MODULE_C_SRC
libpcap_sources +=REMOTE_C_SRC
libpcap_sources +=COMMON_C_SRC
libpcap_sources +=GENERATED_C_SRC
# 定义可执行文件目标
if (defined(ohos_lite))
{
shared_library("libpcap_shared") {
sources = libpcap_sources
include_dirs = common_include_dirs
configs = []
configs = [ ":common_config" ]
deps = []
}
}
else
{
import("//build/ohos.gni")
import("//build/ohos/ndk/ndk.gni")
ohos_shared_library("libpcap_shared") {
sources = libpcap_sources
include_dirs = common_include_dirs
configs = [ ":common_config" ]
deps = []
part_name = "libpcap"
install_enable = true # 是否默认安装(缺省默认不安装),可选
install_images = [ "system" ]
subsystem_name = "thirdparty"
}
}
3、修改tcpdump 的BUILD.gn文件
config("common_config") #通过分析Makefile补充
{
cflags = ["-Wall","-Wextra","-Werror","-g","-O2","-Wno-unused-parameter","-Wno-gnu-variable-sized-type-not-at-end","-Wno-unused-but-set-variable","-Wno-unused-function","-Wno-deprecated-non-prototype"]
defines = ["HAVE_CONFIG_H","_GNU_SOURCE"]
}
common_include_dirs = [
"."
,"//third_party/libpcap"] #通过分析Makefile补充
tcpdump_sources =[ ] #通过分析Makefile补充
common_deps = ["//third_party/libpcap:libpcap_shared"] #通过分析Makefile补充
CSRC = ["fptype.c","tcpdump.c"]
LIBNETDISSECT_SRC = [
"addrtoname.c","addrtostr.c","af.c","ascii_strcasecmp.c","checksum.c","cpack.c","gmpls.c","in_cksum.c","ipproto.c","l2vpn.c",
"machdep.c","netdissect.c","netdissect-alloc.c","nlpid.c","ntp.c","oui.c","parsenfsfh.c","print.c","print-802_11.c","print-802_15_4.c",
"print-ah.c","print-ahcp.c","print-aodv.c","print-aoe.c","print-ap1394.c","print-arcnet.c","print-arista.c","print-arp.c","print-ascii.c","print-atalk.c",
"print-atm.c","print-babel.c","print-bcm-li.c","print-beep.c","print-bfd.c","print-bgp.c","print-bootp.c","print-brcmtag.c","print-bt.c","print-calm-fast.c",
"print-carp.c","print-cdp.c","print-cfm.c","print-chdlc.c","print-cip.c","print-cnfp.c","print-dccp.c","print-decnet.c","print-dhcp6.c"
,"print-domain.c","print-dsa.c","print-dtp.c","print-dvmrp.c","print-eap.c","print-egp.c","print-eigrp.c","print-enc.c","print-esp.c",
"print-ether.c","print-fddi.c","print-forces.c","print-fr.c","print-frag6.c","print-ftp.c","print-geneve.c","print-geonet.c","print-gre.c","print-hncp.c",
"print-hsrp.c","print-http.c","print-icmp.c","print-icmp6.c","print-igmp.c","print-igrp.c","print-ip-demux.c","print-ip.c","print-ip6.c","print-ip6opts.c",
"print-ipcomp.c","print-ipfc.c","print-ipnet.c","print-ipoib.c","print-ipx.c","print-isakmp.c","print-isoclns.c","print-juniper.c","print-krb.c","print-l2tp.c",
"print-lane.c","print-ldp.c","print-lisp.c","print-llc.c","print-lldp.c","print-lmp.c","print-loopback.c","print-lspping.c","print-lwapp.c","print-lwres.c",
"print-m3ua.c","print-macsec.c","print-mobile.c","print-mobility.c","print-mpcp.c","print-mpls.c","print-mptcp.c","print-msdp.c","print-msnlb.c","print-nflog.c",
"print-nfs.c","print-nsh.c","print-ntp.c","print-null.c","print-olsr.c","print-openflow-1.0.c","print-openflow-1.3.c","print-openflow.c","print-ospf.c","print-ospf6.c",
"print-otv.c","print-pflog.c","print-pgm.c","print-pim.c","print-pktap.c","print-ppi.c","print-ppp.c","print-pppoe.c","print-pptp.c","print-ptp.c",
"print-radius.c","print-raw.c","print-realtek.c","print-resp.c","print-rip.c","print-ripng.c","print-rpki-rtr.c","print-rsvp.c","print-rt6.c","print-rtsp.c",
"print-rx.c","print-sctp.c","print-sflow.c","print-sip.c","print-sl.c","print-sll.c","print-slow.c","print-smtp.c","print-snmp.c","print-someip.c","print-ssh.c","print-stp.c",
"print-sunatm.c","print-sunrpc.c","print-symantec.c","print-syslog.c","print-tcp.c","print-telnet.c","print-tftp.c","print-timed.c","print-tipc.c",
"print-token.c","print-udld.c","print-udp.c","print-unsupported.c","print-usb.c","print-vjc.c","print-vqp.c","print-vrrp.c","print-vsock.c","print-vtp.c",
"print-vxlan-gpe.c","print-vxlan.c","print-wb.c","print-whois.c","print-zep.c","print-zephyr.c","print-zeromq.c","signature.c","strtoaddr.c","util-print.c"
]
MISSING_SRC = [
"missing/datalinks.c","missing/dlnames.c","missing/getopt_long.c","missing/getservent.c","missing/pcap_dump_ftell.c","missing/snprintf.c","missing/strdup.c","missing/strlcat.c","missing/strlcpy.c","missing/strsep.c"
]
tcpdump_sources += CSRC
tcpdump_sources += LIBNETDISSECT_SRC
tcpdump_sources += MISSING_SRC
# 定义可执行文件目标
if (defined(ohos_lite))
{
executable("tcpdump") {
sources = tcpdump_sources
include_dirs = common_include_dirs
deps = common_deps
configs += [ ":common_config" ]
}
}
else
{
import("//build/ohos.gni") # 导入编译模板
ohos_executable("tcpdump") {
sources = tcpdump_sources
include_dirs = common_include_dirs
deps = common_deps
configs = [ ":common_config" ]
part_name = "tcpdump"
install_enable = true # 是否默认安装(缺省默认不安装),可选
install_images = [ "system" ]
subsystem_name = "thirdparty"
}
}
4、编译 hb set 设置 standard --> rk3568
hb build --ccache -T tcpdump
报错
[OHOS ERROR] ../../third_party/libpcap/fmtutils.c:354:6: error: incompatible pointer to integer conversion initializing 'int' with an expression of type 'char *' [-Wint-conversion]
[OHOS ERROR] int err = strerror_r(errnum, p, errbuflen_remaining);
[OHOS ERROR] ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[OHOS ERROR] 1 warning and 1 error generated.
解决方法
这个是应为没有引入 import(“//build/ohos.gni”) # 导入编译模板 导致的
修改tcpdump 的BUILD.gn文件 判断没有定义 ohos_lite 的情况下 导入编译模板
报错
../../third_party/tcpdump/missing/strdup.c:41:1: error: a function definition without a prototype is deprecated in all versions of C and is not supported in C2x [-Werror,-Wdeprecated-non-prototype]
解决方法
根据提示添加编译选项 “-Wno-deprecated-non-prototype”
报错
[OHOS ERROR] ../../third_party/tcpdump/missing/snprintf.c:262:1: error: unused function 'xyzprintf' [-Werror,-Wunused-function]
[OHOS ERROR] xyzprintf (struct state *state, const char *char_format, va_list ap)
[OHOS ERROR] ^
解决方法
根据提示添加编译选项 “-Wno-unused-function”
报错
[OHOS ERROR] In file included from ../../third_party/tcpdump/fptype.c:36:
[OHOS ERROR] In file included from ../../third_party/tcpdump/netdissect-stdinc.h:42:
[OHOS ERROR] ../../third_party/tcpdump/ftmacros.h:104:11: error: '_GNU_SOURCE' macro redefined [-Werror,-Wmacro-redefined]
[OHOS ERROR] #define _GNU_SOURCE
[OHOS ERROR] ^
[OHOS ERROR] <command line>:2:9: note: previous definition is here
[OHOS ERROR] #define _GNU_SOURCE 1
[OHOS ERROR] ^
[OHOS ERROR] 1 error generated.
解决方法
代码中找到 #define _GNU_SOURCE 的地方 修改为
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
重新编译
这里看到编译通过了。
到此 openharmony(rk3568)移植tcpdump 完成了