背景:

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.pswp.cn/pingmian/92937.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92937.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/92937.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript的fetch函数的用法

基本语法fetch函数用于发起网络请求&#xff0c;返回一个Promise对象。基本语法如下&#xff1a;fetch(url, options).then(response > response.json()).then(data > console.log(data)).catch(error > console.error(Error:, error));GET请求发起一个简单的GET请求&…

Json和XML文件相互转化

目录 一.XML转Json文件 示例&#xff1a;将XML转换为JSON 依赖准备 Java代码示例 代码详细讲解 二.Json转XML文件 示例&#xff1a;将JSON转换为XML 依赖准备 Java代码示例 代码详细讲解 关键代码解析 将JSON转换为XML 写入文件 示例输入与输出 三.具有相同功能的…

Python科学计算与可视化领域工具TVTK、Mayavi、Mlab、Traits(附视频教程)

概述 TVTK、Mayavi、Mlab 和 Traits 都是 Python 科学计算与可视化领域中紧密相关的工具&#xff0c;它们常被结合使用来处理和展示三维数据。视频教程&#xff1a;https://pan.quark.cn/s/f73e875225ca 1. TVTK TVTK&#xff08;Traits-based Visualization Toolkit&#xff0…

SQL INSERT INTO SELECT 详解

SQL INSERT INTO SELECT 详解 引言 SQL(Structured Query Language)是数据库操作的基础语言,广泛用于各种关系型数据库管理系统中。在SQL中,INSERT INTO SELECT 是一个强大的功能,它允许用户从一个表中选取数据,并直接将这些数据插入到另一个表中。本文将详细讲解 SQL …

python速成学习路线

第一部分&#xff1a;核心基础&#xff08;语法与工具&#xff09; 目标&#xff1a;掌握 Python 的基本语法规则、数据处理方式和开发工具 核心内容&#xff1a; 环境搭建 安装Python 3.x版本&#xff08;推荐3.10&#xff09;配置开发工具&#xff08;如PyCharm、VS Code或…

自然语言处理的实际应用

在这个信息爆炸的时代&#xff0c;我们每天都在与文字、语音打交道 —— 发送消息、查询信息、使用智能助手…… 这些看似平常的互动背后&#xff0c;都离不开一项关键技术的支撑&#xff1a;自然语言处理&#xff08;NLP&#xff09;。作为人工智能的重要分支&#xff0c;NLP …

Docker实战:为项目打造即开即用的宝塔LNMP环境

Docker实战&#xff1a;为项目打造即开即用的宝塔LNMP环境背景一、准备基础镜像二、启动配置容器&#xff08;关键步骤&#xff09;三、容器内环境配置&#xff08;逐步执行&#xff09;1. 基础环境搭建2. 安装Systemd&#xff08;宝塔依赖&#xff09;3. 安装宝塔面板&#xf…

.net\c#web、小程序、安卓开发之基于asp.net家用汽车销售管理系统的设计与实现

.net\c#web、小程序、安卓开发之基于asp.net家用汽车销售管理系统的设计与实现

药房智能盘库系统:基于CV与时间序列预测的库存革命

> 在医疗资源日益紧张的今天,**全国78%的药房仍依赖人工盘库**,平均每100家药房每年因库存问题损失超50万元。当计算机视觉遇见时间序列预测,一场药房库存管理的智能化革命正在悄然发生。 --- ### 一、传统药房库存的三大痛点与破局思路 #### 致命痛点分析 1. **人工…

【互动屏幕】解析双屏联动在数字展厅中的应用与价值

双屏联动 https://www.bmcyzs.com/ 作为现代展厅设计中的重要技术手段&#xff0c;通过两块或多块屏幕的协同工作&#xff0c;实现了信息的动态展示与交互体验的提升。在展厅环境中&#xff0c;双屏联动软件能够将触摸屏与大屏幕无缝连接&#xff0c;使观众通过简单的操作即可控…

clickhouse基础概念及集群部署

一. 简述&#xff1a; ClickHouse 是一款高性能列式存储数据库&#xff0c;专为海量数据的实时分析场景设计。它以极致的查询速度、高效的存储利用率和强大的并行处理能力著称&#xff0c;广泛应用于日志分析、用户行为分析、业务监控等大数据分析领域。1. 核心特性&#xff1a…

低版本 IntelliJ IDEA 使用高版本 JDK 语言特性的问题

现实问题&#xff1a; 目前最新的 IntelliJ IDEA 已经不支持在 Win7 环境上安装了&#xff0c;如果企业内开发环境仍然是 Win7&#xff0c;就会导致很多问题。 比如当前 IDEA 版本为 2023.1&#xff0c;最大支持 JDK17&#xff0c;如何正常使用 JDK21 的新特性呢&#xff1f;比…

3分钟 Spring AI 实现对话功能

1.什么是spring AISpring AI 是 Spring 官方推出的一个基于 Spring 生态的 AI 应用开发框架&#xff0c;旨在简化将人工智能&#xff08;如大语言模型、生成式 AI&#xff09;集成到 Java 应用中的过程。它提供了统一的 API 和工具&#xff0c;让开发者能更轻松地调用 AI 模型2…

CMake笔记:配置(Configure)、生成(Generate)和构建(Build)

以下为AI生成的内容&#xff1a; 一、配置阶段&#xff08;Configure&#xff09; 本质&#xff1a;解析项目逻辑&#xff0c;构建内存模型 触发命令&#xff1a;cmake -S <源码路径> -B <构建路径> 关键操作与输出&#xff1a;操作类型典型案例输出产物变量定义se…

直接编辑pdf文件教程

工具下载地址&#xff1a;https://pan.quark.cn/s/4befbe5f4a77 一、下载并安装软件二、打开软件&#xff0c;并打开一个pdf文件三、编辑PDF文件&#xff0c;并保存四、关闭软件&#xff0c;打开源文件查看效果。

javaswing json格式化工具

效果展示代码 package com.example.springbootdemo;import javax.swing.*; import javax.swing.border.TitledBorder; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeSelectionModel; import java.…

真实案例 | 如何用iFlyCode开发Webpack插件?

01案例背景在项目中&#xff0c;我们经常需要存档前端每次打包的版本&#xff0c;方便线上快速切换不同版本使用。经过思考&#xff0c;我们可以在打包时&#xff0c;将本次打包结果另存为zip压缩包&#xff0c;方便后续使用。于是我准备开发一个Webpack插件实现此功能&#xf…

19day-人工智能-机器学习-分类算法-决策树

1. 什么是决策树学过数据结构与算法的小伙伴应该对树不陌生吧&#xff0c;这里的决策树也是大同小异的&#xff0c;只是每次反之都有一个条件来决定流向的。1.1 决策节点通过条件判断而进行分支选择的节点。如&#xff1a;将某个样本中的属性值(特征值)与决策节点上的值进行比较…

地球磁层全球MHD模型中模拟Dst指数的半经验方法

A semi-empirical approach to simulating the Dst index in global MHD models of Earth’s magnetosphere pdf 1 Introduction Dst指数 (Disturbance storm time index, 地磁暴时扰动指数) 是描述磁暴活动强度应用最广泛的指数&#xff0c;对于研究地磁扰动和磁暴具有重要意…

什么是脏读、幻读、不可重复读?

脏读、幻读和不可重复读是数据库事务隔离级别中常见的三种数据一致性问题。它们描述了在并发事务环境下可能出现的异常现象。下面通过对比表格和具体示例进行清晰解析&#xff1a;核心概念对比表问题类型触发场景本质原因示例脏读 (Dirty Read)事务A读取了事务B未提交的修改读取…