編譯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.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未提交的修改讀取…