dpdk20.11.9 编译arm版本以及在arm 应用中引用dpdk20.11.9

以往19版本的dpdk 都是可以直接用make 的方式进行编译, e.g,

make T=x86_64-native-linux-gcc install

为了和客户那边用的DPDK 版本一致, 这次要用dpdk20.11.9, 并且要把之前跑在X86 版本的服务器上的程序跑在ARM 版本上.

目前有两个问题:

1. 编译出arm 版本的dpdk.

2. 把编译出来的dpdk lib 引用到arm版本的 testArmApp中.

-------------------------------------------------------------

1. 编译出arm 版本的dpdk.

1). 下载源码:

dpdk.or -> core ->download -> 选择20.11.9 下载:

DPDK

dpdk-20.11.9.tar.xz

2). 从dpdk.org中搜索相关的步骤可以得到以下信息:

4. Cross compiling DPDK for aarch64 and aarch32 — Data Plane Development Kit 23.11.0 documentation

前边的步骤, 官网写得很清楚了, 最后两个步骤的关键步骤说一下:

# 这一步是准备一些编译相关的配置.
meson setup aarch64-build-gcc --cross-file config/arm/arm64_armv8_linux_gcc

# 这里是按之前生成的配置文件正式编译
ninja -C aarch64-build-gcc

3). 以前步骤很快就把dpdk 编译出来了.

4.). 把dpdk 引用到testArmApp 中. 

这个时候发现dpdk 20中的makefile变了, "include $(RTE_SDK)/mk/rte.extapp.mk"  这些语句没有了. 加上也会报错. 这行的意思就是初始化一些dpdk的lib 依赖, 以及确定gcc 版本, Ld 版本等.

那么在makefile中就要手动加入Lib的引用了. 

开始使用的全是-lrte_eal ... 这种参数来编译的, 也编译成功了. 不过testArmApp在服务器上跑的时候发现.so 文件(动态链接库)找不到.

所以把所有dpdk lib 相关的都改成了 .a的形式, 如下所示:

我们先注意一下51 行这里,有问题, 后边再说.

按以上新的.a 的依赖方式, 发现编译到最后的时候, 始终有两个函数找不到定义:

dpdk-stable-20.11.9/arm64-build-retry2/lib/librte_eal.a(librte_eal_common_eal_common_options.c.o): In function `handle_eal_info_request':

eal_common_options.c:(.text+0x34): undefined reference to `rte_tel_data_start_array'

eal_common_options.c:(.text+0x54): undefined reference to `rte_tel_data_add_array_string'

/data/yubo/dpdk-stable-20.11.9/arm64-build-retry2/lib/librte_eal.a(librte_eal_common_eal_common_options.c.o): In function `eal_save_args':

eal_common_options.c:(.text+0x90c): undefined reference to `rte_telemetry_register_cmd'

eal_common_options.c:(.text+0x924): undefined reference to `rte_telemetry_register_cmd'

/data/yubo/dpdk-stable-20.11.9/arm64-build-retry2/lib/librte_eal.a(librte_eal_linux_eal.c.o): In function `rte_eal_init':

eal.c:(.text+0x1e48): undefined reference to `rte_telemetry_init'

/data/yubo/dpdk-stable-20.11.9/arm64-build-retry2/lib/librte_eal.a(librte_eal_common_eal_common_devargs.c.o): In function `rte_devargs_layers_parse':

eal_common_devargs.c:(.text+0x2e8): undefined reference to `rte_kvargs_parse_delim'

eal_common_devargs.c:(.text+0x34c): undefined reference to `rte_kvargs_free'

再三确认了代码和函数, 用arch -t 查看相关的.a 文件也发现定义的, 但是还是在Link这一步会出问题.

最后才发现. 比如A.a 中调用了B.a 那, 依赖时, A.a 要放到前边, 所以.a的依赖顺序改成以下:

lib 引用没有问题了, 又报了以下问题:

/data//dpdk-stable-20.11.9/arm64-build/lib/librte_eal.a(librte_eal_common_eal_common_log.c.o): In function `rte_log_get_stream':
eal_common_log.c:(.text+0x20): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against `.bss'
/data//dpdk-stable-20.11.9/arm64-build/lib/librte_eal.a(librte_eal_common_eal_common_log.c.o): In function `eal_log_set_default':
eal_common_log.c:(.text+0x800): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against `.bss'
/data//dpdk-stable-20.11.9/arm64-build/lib/librte_eal.a(librte_eal_linux_eal_interrupts.c.o): In function `eal_intr_thread_main':
eal_interrupts.c:(.text+0x23c): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against `.bss'
/data//dpdk-stable-20.11.9/arm64-build/lib/librte_eal.a(librte_eal_linux_eal_interrupts.c.o): In function `rte_intr_callback_register':
eal_interrupts.c:(.text+0x8ac): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against `.bss'
/data//dpdk-stable-20.11.9/arm64-build/lib/librte_eal.a(librte_eal_linux_eal_interrupts.c.o): In function `rte_intr_callback_unregister':
eal_interrupts.c:(.text+0xb98): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against `.bss'
/data//dpdk-stable-20.11.9/arm64-build/lib/librte_eal.a(librte_eal_linux_eal_interrupts.c.o): In function `rte_eal_intr_init':
eal_interrupts.c:(.text+0x1684): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against `.bss'
/data//dpdk-stable-20.11.9/arm64-build/lib/librte_eal.a(librte_eal_linux_eal_interrupts.c.o): In function `rte_thread_is_intr':
eal_interrupts.c:(.text.experimental+0x4): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against `.bss'
/data//dpdk-stable-20.11.9/arm64-build/lib/librte_eal.a(librte_eal_linux_eal_interrupts.c.o): In function `rte_intr_callback_unregister_pending':
eal_interrupts.c:(.text.experimental+0x38): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against `.bss'
/data//dpdk-stable-20.11.9/arm64-build/lib/librte_eal.a(librte_eal_linux_eal_memalloc.c.o): In function `huge_sigbus_handler':
eal_memalloc.c:(.text+0x4): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against `.bss'
/data//dpdk-stable-20.11.9/arm64-build/lib/librte_eal.a(librte_eal_linux_eal_memalloc.c.o): In function `huge_wrap_sigsetjmp':
eal_memalloc.c:(.text+0x1c): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against `.bss'

查了很多网页发现是因为testArmApp中定义的数组太大, 和arm 版本默认的栈大小兼容. 需要加上以下参数进行编译:

-fno-PIC mcmodel=lagre

开始尝试在testArmApp 编译的时候加上这两个参数, 编译时发现并不行.

那估计是被引用 的dpdk Lib 也需要重新编译. 加上这两个参数. 那问题来了, dpdk 的编译都不知道参数哪里配置的.

经过多次尝试发现, dpdk的的编译参数是在以下这一步生成的:

meson setup aarch64-build-gcc --cross-file config/arm/arm64_armv8_linux_gcc

发现相关的编译参数都在文件夹 aarch64-build-gcc中, 经过多次编译发 这个只是一个文件夹名字, 是可以随便取的.  所以在这个文件夹中, 我找到了相关的配置文件:build.ninja

把这个文件中所有参数: fPIC 为 fno-pic mcmodel=large

然后再执行: 

ninja -C aarch64-build-gcc

这个时候发现testArmApp 就正常生成了.

arm服务器上测试, testArmApp  能正常工作. 

=======================================================

5). 以下是一些解决问题过程的工具记录:

5.1).cd /data/dpdk-stable-20.11.9

meson build

提示要用python3.7 以上.

==>安装 python 3.7:

sudo apt-get install python3.7

From <ubuntu如何安装python3.7.0? - 优草派>

=> 版本确认

python --version是3.8.0

python3 --version 是3.6.9

看来python3 的默认版本不对, 要把phyton3 改成3.8.0

whereis python3   找到bin 位置, 然后修改相关链接:

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1

test@test-accd100012:/data/dpdk-stable-20.11.9$ python3 --version

Python 3.8.0

这样就对了.

=>再重启meson build :

提示没有 ModuleNotFoundError: No module named 'mesonbuild'

===>

安装meson build 相关东西. 按: DPDK 交叉编译基本流程_dpdk交叉编译-CSDN博客  尝试:

下载交叉编译工具链

$ wget https://developer.arm.com/-/media/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz

====>这一步就下不下来.   让IT修改外网配置后,能下载了.

将交叉编译工具的路径加入 PATH环境变量中

$ export PATH=$PATH:/home/zhoumin/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin

=>numactl 手动下载:

Releases · numactl/numactl · GitHub   2.0.13 的src code.

(wget 下载不了. 只有手动下载)

=>生成配置文件

meson setup arm64-build --cross-file config/arm/arm64_armv8_linux_gcc

这一步报: 'meson==0.52.1' distribution was not found and is required by the application

按:https://blog.csdn.net/a50095949/article/details/127289702  步骤试下:

sudo apt-get install python3 python3-pip ninja-build

pip3 install --user meson==0.52.1

到此, 准备编译dpdk 编译的工具链时遇到的问题就完了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/309409.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spark与云存储的集成:S3、Azure Blob Storage

在现代数据处理中&#xff0c;云存储服务如Amazon S3和Azure Blob Storage已成为存储和管理数据的热门选择。与此同时&#xff0c;Apache Spark作为大数据处理框架也备受欢迎。本文将深入探讨如何在Spark中集成云存储服务&#xff0c;并演示如何与S3和Azure Blob Storage进行互…

R语言安装教程(附安装包链接)

R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件&#xff0c;它是一个用于统计计算和统计制图的优秀工具。 Mac支持M1芯片&#xff0c;下载其中的arm即可&#xff0c;其余下载另一个文件 下载链接&#xff1a; 链接: https://pan…

Python如何使用Excel文件

使用Python操作Office——EXCEL 首先介绍下office win32 com接口&#xff0c;这个是MS为自动化提供的操作接口&#xff0c;比如我们打开一个EXCEL文档&#xff0c;就可以在里面编辑VB脚本&#xff0c;实现我们自己的效果。对于这种一本万利的买卖&#xff0c;Python怎么能放过…

怎么样检查自己系统上的Python环境中是否有某个包(扩展库)?

比如我们这里想看下有没有库pytz 很简单&#xff0c;进入Python的命令行&#xff0c;然后输入下面的命令&#xff1a; import pytz如果有这个库&#xff0c;则不会报错&#xff0c;否则会报错。 Windows的测试结果如下&#xff1a; Centos的测试结果如下&#xff1a;

【LV12 DAY12-13 GPIO C 语言与寄存器封装】

GPIO 通用型输入输出&#xff0c;GPIO可以控制连接在其引脚实现信号的输入和输出 芯片的引脚和外部设备相连从而实现与外部硬件的通讯&#xff0c;控制&#xff0c;信号采集的功能。 控制CHG_COK引脚输出为高电平&#xff0c;LED亮&#xff0c;输出为低电平&#xff0c;LED熄灭…

麦芯(MachCore)开发教程1 --- 设备软件中间件

黄国强 2024/1/10 acloud163.com 对任何公司来说&#xff0c;在短时间内开发一款高质量设备专用软件&#xff0c;是一件不太容易做到的事情。麦芯是笔者发明的一款设备软件中间件产品。麦芯致力于给设备厂商提供一个开发工具和平台&#xff0c;让客户快速高效的开发自己的设备专…

Unity Delaunay三角剖分算法 动态生成

Unity Delaunay三角剖分算法 动态生成 Delaunay三角剖分Delaunay三角剖分 定义Delaunay 边Delaunay 空圆特性 Delaunay 三角形Delaunay 最大化最小角特性 Delaunay 三角形特征Delaunay 算法Delaunay Lawson算法Delaunay Bowyer-Watson算法 Unity Delaunay三角剖分 应用Unity 工…

SpringBoot3 WebFlux 可观测最佳实践

前言 链路追踪是可观测性软件系统的一个非常好的工具。它使开发人员能够了解应用程序中和应用程序之间不同交互发生的时间、地点和方式。同时让观测复杂的软件系统变得更加容易。 从Spring Boot 3开始&#xff0c;Spring Boot 中用于链路追踪的旧 Spring Cloud Sleuth 解决方…

08、Kafka ------ 消息存储相关的配置-->消息过期时间设置、查看主题下的消息存活时间等配置

目录 消息存储相关的配置★ 消息的存储介绍★ 消息过期时间及处理方式演示&#xff1a;log.cleanup.policy 属性配置 ★ 修改指定主题的消息保存时间演示&#xff1a;将 test2 主题下的消息的保存时间设为10个小时1、先查看test2主题下的配置2、然后设置消息的保存时间3、然后再…

JavaScript基础课程

JavaScript 基础 - 第1天 了解变量、数据类型、运算符等基础概念&#xff0c;能够实现数据类型的转换&#xff0c;结合四则运算体会如何编程。 体会现实世界中的事物与计算机的关系 理解什么是数据并知道数据的分类 理解变量存储数据的“容器” 掌握常见运算符的使用&#x…

SpringSecurity集成JWT实现后端认证授权保姆级教程-授权配置篇

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f492; 公众号&#xff1a;知识浅谈 &#x1f525;网站…

【Spring Boot】SpringMVC入门

1.什么是springMVC MVC就是把一个项目分成了三部分&#xff1a; MVC是一种思想。Spring进行了实现,称为Spring MVC。SpringBoot是创建SpringMVC项目的一种方式而已。springMVC对于MVC做出了一些改变&#xff1a; 当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页…

【JaveWeb教程】(18) MySQL数据库开发之 MySQL数据库设计-DDL 如何查询、创建、使用、删除数据库数据表 详细代码示例讲解

目录 2. 数据库设计-DDL2.1 项目开发流程2.2 数据库操作2.2.1 查询数据库2.2.2 创建数据库2.2.3 使用数据库2.2.4 删除数据库 2.3 图形化工具2.3.1 介绍2.3.2 安装2.3.3 使用2.2.3.1 连接数据库2.2.3.2 操作数据库 2.3 表操作2.3.1 创建2.3.1.1 语法2.3.1.2 约束2.3.1.3 数据类…

从0到1实现html文件转换为markdown文档(进度0.1)

Spider-Man 前言准备环境1、node.js2、git 执行指令顺序报错及其解决方案一、npm 错误&#xff01;可以在以下位置找到此运行的完整日志解决方案 二、没有修改权限解决方案&#xff1a; 注意事项总结 前言 当我们处理文档时&#xff0c;常常会遇到将HTML文档转换为Markdown文档…

微信小程序:发送小程序订阅消息

文档&#xff1a;小程序订阅消息&#xff08;用户通过弹窗订阅&#xff09;开发指南 目录 步骤一&#xff1a;获取模板 ID步骤二&#xff1a;小程序端获取参数2.1、获取消息下发权限2.2、获取登录凭证&#xff08;code&#xff09; 步骤三&#xff1a;后端调用接口下发订阅消息…

从生活入手学编程(1):Edge浏览器设置自动刷新专业教程

一、前言 我们都知道&#xff0c;Edge浏览器运行时的速度卡的实在是感人…… 于是今天&#xff0c;我就突发奇想&#xff0c;来看一看怎么刷新并且还能保留页面内容。 二、探索 首先&#xff0c;我在此提醒您&#xff0c;在使用这种方法时要非常小心。因为更改网页源代…

一级倒立摆控制 - 非线性 MPC 控制及 MATLAB 实现

系列文章目录 前言 本示例使用非线性模型预测控制器对象和块实现对小车上倒立摆的摆动和平衡控制。 本示例需要 Optimization Toolbox™ 软件为非线性 MPC 提供默认的非线性编程求解器&#xff0c;以计算每个控制间隔的最优控制动作。 一、摆锤/小车装配 本例中的被控对象是…

[笔记]学习做微信小程序

学习视频&#xff1a;前端微信小程序开发教程 本篇文章 只对关键内容笔记&#xff0c;用于自用。 这里写目录标题 注册、下载、安装我的小程序ID&#xff1a;wxe1fbd6939d8797d8我的小游戏ID&#xff1a;wx8b2c3e47ac9127b7开发者工具外观代理设置 创建第一个小程序主界面5个组…

Redis:原理速成+项目实战——Redis实战8(基于Redis的分布式锁及优化)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战7&#xff08;优惠券秒杀细节解决超卖、一人一单问题&#xff09; &#x1f4d…

C语言数组基础知识

目录 一维数组&#xff1a; 一维数组的创建&#xff1a; 一维数组的访问&#xff1a; 一维数组在内存中的存储&#xff1a; 二维数组&#xff1a; 二维数组的创建&#xff1a; 二维数组的初始化&#xff1a; 二维数组的使用&#xff1a; 二维数组在内存中的存储&#x…