编译Android版本可用的高版本iproute2
背景:
Android自带的iproute2 太老,很多指令格式不支持
直接基于Android源码,替换源码下iproute2 代码编译新版,报错太多,于是改用Android NDK工具编译
环境:
android-ndk-r25c-linux.zip 下载链接:NDK 下载 | Android NDK | Android Developers
iproute2源码:Index of /pub/linux/utils/net/iproute2/
我本地编译的两个版本iproute2-5.17.0 和 iproute2-6.9.0
编译:
执行
./configure生成config.mk
修改生成的config.mk
主要是配置编译器以及移除编译器不支持的配置
5.17.0 config.mk
# Generated config
# user can control verbosity similar to kernel builds (e.g., V=1)
ifeq ("$(origin V)", "command line")VERBOSE = $(V)
endif
ifndef VERBOSEVERBOSE = 0
endif
ifeq ($(VERBOSE),1)Q =
elseQ = @
endififeq ($(VERBOSE), 0)QUIET_CC = @echo ' CC '$@;QUIET_AR = @echo ' AR '$@;QUIET_LINK = @echo ' LINK '$@;QUIET_YACC = @echo ' YACC '$@;QUIET_LEX = @echo ' LEX '$@;
endifAR:=/data/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar
CC:=/data/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android28-clang --sysroot=/data/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/sysroot
YACC:=bison
TC_CONFIG_NO_XT:=y
LIBDIR:=/usr/lib
IP_CONFIG_SETNS:=y
CFLAGS += -DHAVE_SETNS
#CFLAGS += -DHAVE_HANDLE_AT
CFLAGS += -DNEED_STRLCPY
CFLAGS += -D__BIONIC__
CFLAGS += -fPIC
CFLAGS += -I/data/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include
#HAVE_CAP:=y
#CFLAGS += -DHAVE_LIBCAP
LDLIBS += -L/data/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/lib64%.o: %.c$(QUIET_CC)$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CPPFLAGS) -c -o $@ $<
TC_CONFIG_XT:=n
6.9.0 config.mk
# Generated config
# user can control verbosity similar to kernel builds (e.g., V=1)
ifeq ("$(origin V)", "command line")VERBOSE = $(V)
endif
ifndef VERBOSEVERBOSE = 0
endif
ifeq ($(VERBOSE),1)Q =
elseQ = @
endififeq ($(VERBOSE), 0)QUIET_CC = @echo ' CC '$@;QUIET_AR = @echo ' AR '$@;QUIET_LINK = @echo ' LINK '$@;QUIET_YACC = @echo ' YACC '$@;QUIET_LEX = @echo ' LEX '$@;
endif
PKG_CONFIG:=pkg-config
AR:=/data/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar
CC:=/data/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android28-clang
YACC:=bison
TC_CONFIG_NO_XT:=y
LIBDIR:=/usr/lib
IP_CONFIG_SETNS:=y
CFLAGS += -DHAVE_SETNS
#CFLAGS += -DHAVE_HANDLE_AT
#HAVE_SELINUX:=y
#LDLIBS += -lselinux
#CFLAGS += -DHAVE_SELINUX
#HAVE_ELF:=y
#CFLAGS += -DHAVE_ELF
#LDLIBS += -lelf
#CFLAGS += -DHAVE_LIBBSD_
#LDLIBS += -lbsd_
CONF_COLOR:=COLOR_OPT_NEVER%.o: %.c$(QUIET_CC)$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CPPFLAGS) -c -o $@ $<
注意:
需要使用大于等于android28 的clang,否则会报找不到glob,低版本clang可以注释掉代码中glob相关代码,非核心功能,就一个文件有用,注释掉不影响核心功能使用
修改NDK头文件,解决编译报错
还有一个比较坑的是用clang编译报 sysroot/usr/include/arpa/inet.h:43:47: error: unknown type name 'in_addr_t'
但是这个定义是在<bits/in_addr.h> 也被include了,如果在inet.h 再定义,编译又报重复定义
于是使用NDK的sysroot/usr/include/arpa/inet.h 添加如下定义
#ifndef in_addr_t
#warning "in_addr_t is NOT defined"
typedef uint32_t in_addr_t;
#else
#warning "in_addr_t is defined"
#endif
源码修改
编译中遇到的报错
diff -ruN -x .o buildroot/output/build/iproute2-5.17.0/ip/iplink_bond.c iproute2-5.17.0/ip/iplink_bond.c
--- E245/src/buildroot/output/build/iproute2-5.17.0/ip/iplink_bond.c 2022-03-22 14:59:11.000000000 +0000
+++ iproute2-5.17.0/ip/iplink_bond.c 2025-08-08 08:54:12.702263581 +0000
@@ -21,6 +21,7 @@#include "json_print.h"#define BOND_MAX_ARP_TARGETS 16
+#define strdupa(s) strcpy((char *)alloca(strlen(s) + 1), (s))static unsigned int xstats_print_attr;static int filter_index;diff -ruN -x .o buildroot/output/build/iproute2-5.17.0/ip/ipseg6.c iproute2-5.17.0/ip/ipseg6.c
--- E245/src/buildroot/output/build/iproute2-5.17.0/ip/ipseg6.c 2022-03-22 14:59:11.000000000 +0000
+++ iproute2-5.17.0/ip/ipseg6.c 2025-08-08 08:58:45.938801889 +0000
@@ -230,7 +230,9 @@invarg("hmac ALGO value is invalid", *argv);}opts.cmd = SEG6_CMD_SETHMAC;
+ #ifndef __BIONIC__opts.pass = getpass(HMAC_KEY_PROMPT);
+ #endif} else {invarg("unknown", *argv);}diff -ruN -x .o buildroot/output/build/iproute2-5.17.0/lib/color.c iproute2-5.17.0/lib/color.c
--- E245/src/buildroot/output/build/iproute2-5.17.0/lib/color.c 2022-03-22 14:59:11.000000000 +0000
+++ iproute2-5.17.0/lib/color.c 2025-08-08 08:56:19.357637590 +0000
@@ -11,6 +11,8 @@#include "color.h"#include "utils.h"+#define strdupa(s) strcpy((char *)alloca(strlen(s) + 1), (s))
+static void set_color_palette(void);enum color {diff -ruN -x .o buildroot/output/build/iproute2-5.17.0/lib/utils.c iproute2-5.17.0/lib/utils.c
--- E245/src/buildroot/output/build/iproute2-5.17.0/lib/utils.c 2022-03-22 14:59:11.000000000 +0000
+++ iproute2-5.17.0/lib/utils.c 2025-08-08 08:13:37.173479953 +0000
@@ -525,7 +525,7 @@addr->flags |= ADDRTYPE_INET;break;case AF_INET6:
- if (IN6_IS_ADDR_UNSPECIFIED(addr->data))
+ if (IN6_IS_ADDR_UNSPECIFIED((const struct in6_addr *)addr->data))addr->flags |= ADDRTYPE_INET_UNSPEC;else if (IN6_IS_ADDR_MULTICAST(addr->data))addr->flags |= ADDRTYPE_INET_MULTI;diff -ruN -x .o buildroot/output/build/iproute2-5.17.0/tc/f_flower.c iproute2-5.17.0/tc/f_flower.c
--- E245/src/buildroot/output/build/iproute2-5.17.0/tc/f_flower.c 2022-03-22 14:59:11.000000000 +0000
+++ iproute2-5.17.0/tc/f_flower.c 2025-08-08 09:07:50.898267831 +0000
@@ -304,7 +304,7 @@char *slash, *mask = NULL;size_t slen, slen_mask = 0;- slash = index(str, '/');
+ slash = strchr(str, '/');if (slash) {*slash = 0;mask = slash + 1;
@@ -1086,7 +1086,7 @@if (mask_len + strlen(token) > XATTR_SIZE_MAX)return -1;- data_len = strlen(rindex(token, ':'));
+ data_len = strlen(strrchr(token, ':'));sprintf(&mask[mask_len], "ffff:ff:");mask_len += 8;memset(&mask[mask_len], 'f', data_len - 1);diff -ruN -x .o buildroot/output/build/iproute2-5.17.0/tc/m_ct.c iproute2-5.17.0/tc/m_ct.c
--- E245/src/buildroot/output/build/iproute2-5.17.0/tc/m_ct.c 2022-03-22 14:59:11.000000000 +0000
+++ iproute2-5.17.0/tc/m_ct.c 2025-08-08 09:09:24.160917467 +0000
@@ -163,7 +163,7 @@char *slash, *mask = NULL;size_t slen, slen_mask = 0;- slash = index(str, '/');
+ slash = strchr(str, '/');if (slash) {*slash = 0;mask = slash+1;
iproute2-6.9.0 修改和5.17.0 大部分相同,还有其他几个文件需要修改,修改方法参考上面patch里的文件即可。
编译好的二进制文件:
iproute2 5.17.0 android版本https://download.csdn.net/download/u013463707/91643106
iproute2-6.9.0 android版本https://download.csdn.net/download/u013463707/91643113