当前位置: 首页 > 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.dtcms.com/a/325298.html

相关文章:

  • AI 健康管家:重构健康管理的未来图景
  • 大模型落地实践:从技术重构到行业变革的双重突破
  • AI生成代码时代的商业模式重构:从“软件即产品”到“价值即服务”
  • 亚马逊广告底层逻辑重构:从流量博弈到价值创造的战略升维
  • uView Pro 正式开源!70+ Vue3 组件重构完成,uni-app 组件库,你会选择它吗?
  • 数据库基本操作
  • 自动化备份全网服务器数据平台项目
  • 掘金数据富矿,永洪科技为山东黄金定制“数智掘金”实战营
  • k8s 部署mysql主从集群
  • kafka 中的Broker 是什么?它在集群中起什么作用?
  • 类银河恶魔城 P20-1 Slime enemy
  • Flutter学习笔记(六)---状态管理、事件、路由、动画
  • 达梦自定义存储过程实现获取表完整的ddl语句
  • Python FastAPI + React + Nginx 阿里云WINDOWS ECS部署实战:从标准流程到踩坑解决全记录
  • 爬虫与数据分析结和
  • NEON性能优化总结
  • Spring MVC 注解参数接收详解:@RequestBody、@PathVariable 等区别与使用场景
  • EXISTS 替代 IN 的性能优化技巧
  • 大数据量下分页查询性能优化实践(SpringBoot+MyBatis-Plus)
  • 基于Spring Data Elasticsearch的分布式全文检索与集群性能优化实践指南
  • Rust:anyhow 高效错误处理库核心用法详解
  • Rust 实战五 | 配置 Tauri 应用图标及解决 exe 被识别为威胁的问题
  • 新人该如何将不同的HTML、CSS、Javascript等文件转化为Vue3文件架构
  • 零基础学习jQuery第三天
  • 探秘华为:松山湖的科技与浪漫之旅
  • SQL 基础查询语句详解
  • DDIA第五章:分布式数据复制中的一致性与冲突处理
  • 基于STM32设计的矿山环境监测系统(NBIOT)_262
  • (25.08)Ubuntu20.04复现KISS-ICP
  • 【TensorRT踩坑记录】安装与使用