当前位置: 首页 > news >正文

编译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

http://www.lryc.cn/news/617217.html

相关文章:

  • 机器学习 - Kaggle项目实践(1)Titanic
  • C++多态详解
  • SDI设计中,为何SD-SDI模式下,接收器用DRU实现,在3G-SDI模式下,使用transceiver实现
  • 多轮会话记忆的核心挑战
  • Spring Boot 中 @Transactional 解析
  • 自动化备份全网服务器数据平台项目
  • P2865 [USACO06NOV] Roadblocks G
  • ListNode* dummy = new ListNode();什么意思
  • 【功能测试】软件集成测试思路策略与经验总结
  • 使用纯NumPy实现回归任务:深入理解机器学习本质
  • 小结: getSpringFactoriesInstances从 `spring.factories` 文件中加载和实例化指定类型的类
  • 一维码+二维码+字符识别
  • 关于开发面对颠覆性需求变更的思考
  • SpringBoot 实现 Excel 导入导出功能的三种实现方式
  • MySQL语句,体系结构等基础知识解析
  • 量子计算:叩响金融定价革命的大门——期权定价的范式转移
  • 【PyTorch学习笔记 - 01】 Tensors(张量)
  • MLAG双活网络妙招:BGP + 静态VRRP实现智能负载均衡
  • MATLAB实现遗传算法求解路网路由问题
  • 【FAQ】Win11创建资源不足绕开微软账号登录
  • 【数据结构入门】树
  • 2025世界机器人大会|具身智能机器人十大发展趋势
  • 人脸识别系统技术文档
  • C9800 ISSU升级
  • Netty使用CA证书实现tls双认证
  • Linux ethernet驱动移植之常见问题
  • html转成markdown(1.0.0)
  • Mybatis学习之缓存(九)
  • 文件编辑html
  • 通用 maven 私服 settings.xml 多源配置文件(多个仓库优先级配置)