安卓平台valgrind交叉编译

news2024/11/26 23:37:25

背景

通过上次的文章valgrind跨平台调试及其问题分析,为同事们在大部分平台下进行内存问题分析提供了帮助。但是也遇到了阻塞情况:android 平台,无法交叉编译通过大家对于编译这件事,似乎天然有一种排斥,本能的拒绝,很少会去研究。只会淡淡的说一句“艺华,按照你的文档操作,我编译不过啊”。

呃…(内心无语)

短暂无语后,只能说:我来看看吧。

这次遇到的问题,个人感觉还是挺麻烦的。虽然最终的解决是解决掉了,但也是换了一个思路,投机取巧。本文我会将两者思路都进行描述,针对第一种方式,有知道原因的朋友,还请告知,十分感谢。若您急需答案,可以直接看方法二。

思路一

虽然该思路最终没有将问题解决,但是过程中的一些分析思路,还是希望能和大家分享。

该项目的host环境是android系统,并且客户提供的交叉编译工具链是ndk23。valgrind 的版本为3.22.0

经过上篇文章,交叉编译的流程可以简单为:

  1. export 环境变量
  2. 执行configure,检测主机系统的特性,设置编译选项,确认安装路径,生成Makefile。
  3. 执行make -j8 编译。

其中export环境变量较为简单,一般host提供交叉编译工具链时,都会进行指导。

但是其中configure的设置,可能存在一些困难:

  • --host参数设置,一般情况下,填为目标架构-操作系统,按此理解我们就应该填aarch64-android。但是我们会遇到下面的异常:
yihua@ubuntu:~/valgrind-3.22.0$ ./configure --host=aarch64-android
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for aarch64-android-strip... no
checking for strip... strip
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking whether ln -s works... yes
checking for style of include used by make... GNU
checking for aarch64-android-gcc... /home/yihua/toolchain/android-ndk-r23b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android30-clang
......
checking for perl... /usr/bin/perl
checking for gdb... /usr/bin/gdb
checking dependency style of /home/yihua/toolchain/android-ndk-r23b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android30-clang... gcc3
checking for diff -u... yes
checking for a supported version of gcc... ok (clang-12.0.8)
checking build system type... x86_64-pc-linux-gnu
checking host system type... aarch64-unknown-android
checking for a supported CPU... ok (aarch64)
checking for a 64-bit only build... no
checking for a 32-bit only build... no
checking for a supported OS... no (android)
configure: error: Valgrind is operating system specific. Sorry.
yihua@ubuntu:~/valgrind-3.22.0$

如提示所示,并不支持android系统,但是官网明确表示工具支持安卓系统。

那接下来如何操作呢?

我们可以尝试看看工程中的README说明文档。如下:

yihua@ubuntu:~/valgrind-3.22.0$ ls README*
README          README.android           README_DEVELOPERS            README.freebsd  README_MISSING_SYSCALL_OR_IOCTL  README.s390
README.aarch64  README.android_emulator  README_DEVELOPERS_processes  README.mips     README_PACKAGERS                 README.solaris
yihua@ubuntu:~/valgrind-3.22.0$

可知文件README.android指导了如何进行android系统的编译。最终执行以下命令:

./configure --prefix=/data/local/Inst --host=aarch64-unknown-linux --target=aarch64-unknown-linux 

编译过程中遇到的问题

configure将准备工作安排好后,则进行编译。由于工具链的不同,也遇到了一些问题。

问题一:__builtin_longjmp is not supported for the current target;

因为valgrind 中会用到非局部跳转函数setjmplongjmp函数,但是clang并不支持这两个函数的实现,因此报了这样的错误。

这种错误的解决方式,只有在工程中手写函数实现。可参考Build arm64 target valgrind with simplified bionic setjmp.S。由于该解决思路较早,与当前的valgrind版本不匹配,修改方式略有差异。但是其核心思想:实现setjmplongjmp。大家可以抄作业:我修改了以下文件。

coregrind/Makefile.am
coregrind/Makefile.in
coregrind/m_gdbserver/setjmp.S
include/pub_tool_libcsetjmp.h

再重新执行configure,编译

问题二:typedef redefinition with different types ('struct Elf32_Nhdr' vs 'struct elf32_note')

这个问题是因为结构体重复定义导致的。因为ndk23的工具链中已经有该结构的定义,因此该文件不再需要,注释掉即可。

问题三:ld: error: unable to find library -lgcc

由图可知,在编译memcheck工具时,需要链接libgcc.a静态库,但是ndk23工具链中并没有该库。我们可以尝试在Makefile 中去除该依赖

问题四:32位工具编译失败

在问题一中,我添加了setjmplongjmp的实现,但那仅针对于64bit版本。因此在编译32bit 软件时,会出现该问题。因为我的host主机是64bit,因此我就没有添加32bit 的 setjmplongjmp。而是修改Makefile,不编译32bit版本。

后续编译其它工具也会出现类似错误,但是此时memcheck已经编译成功。于是我则修改上层Makefile,不编译其它工具。

最终编译成功。

但是在目标机调试时会出现断言错误,输出如下:

/bin/valgrind --tool=memcheck --leak-check=full  --track-origins=yes ./main                                                        <
==22523== Memcheck, a memory error detector
==22523== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==22523== Using Valgrind-3.22.0 and LibVEX; rerun with -h for copyright info
==22523== Command: ./main
==22523==
WARNING: linker: Warning: "/home/yihua/valgrind-3.22.0/Inst/libexec/valgrind/vgpreload_core-arm64-linux.so" has unsupported flags DT_FLAGS_1=0x421 (ignoring unsupported flags)
WARNING: linker: Warning: "/home/yihua/valgrind-3.22.0/Inst/libexec/valgrind/vgpreload_memcheck-arm64-linux.so" has unsupported flags DT_FLAGS_1=0x421 (ignoring unsupported flags)

valgrind: m_redir.c:796 (void vgPlain_redir_add_ifunc_target(Addr, Addr)): Assertion 'old' failed.

host stacktrace:
==22523==    at 0x580DC810: show_sched_status_wrk (m_libcassert.c:407)
==22523==    by 0x580DCB7B: report_and_quit (m_libcassert.c:478)
==22523==    by 0x580DCB57: vgPlain_assert_fail (m_libcassert.c:544)
==22523==    by 0x580F5CAB: vgPlain_redir_add_ifunc_target (m_redir.c:796)
==22523==    by 0x581687A7: do_client_request (scheduler.c:2072)
==22523==    by 0x581687A7: vgPlain_scheduler (scheduler.c:1542)
==22523==    by 0x5817BEDF: thread_wrapper (syswrap-linux.c:102)
==22523==    by 0x5817BEDF: run_a_thread_NORETURN (syswrap-linux.c:155)
==22523==    by 0xFFFFFFFFFFFFFFFF: ???

sched status:
  running_tid=1

Thread 1: status = VgTs_Runnable (lwpid 22523)
==22523==    at 0x5B72448: _vgnU_ifunc_wrapper (vg_preloaded.c:147)
client stack range: [0x1FFEFFA000 0x1FFF000FFF] client SP: 0x1FFEFFD320
valgrind stack range: [0x10090B4000 0x10091B3FFF] top usage: 12304 of 1048576


Note: see also the FAQ in the source distribution.
It contains workarounds to several common problems.
In particular, if Valgrind aborted or crashed after
identifying problems in your program, there's a good chance
that fixing those problems will prevent Valgrind aborting or
crashing, especially if it happened in m_mallocfree.c.

If that doesn't help, please report this bug to: www.valgrind.org

In the bug report, send all the above text, the valgrind
version, and what OS and version you are using.  Thanks.

很可惜因为时间的原因,就放弃了。如果有知道原因的小伙伴,还请不吝赐教,十分感谢。

思路二

在十分困惑的时候,我在想这个版本的交叉编译工具链会出现这些问题呢?因为在之前编译arm-linux平台都是很顺利的。

能直观感受到的是,android 交叉编译用的是clang,其它linux工具链用的是gcc。于是参考clang 与 GCC 的区别文章,其中有一个见解:

于是我就想改为gcc去编译valgrind。于是乎找了一个早期版本的ndk14。android-ndk-r14b-linux-x86_64.zip

再参考valgrind跨平台调试及其问题分析,发现异常顺利,并没有报错。并且调试也是一次成功。

困扰一段时间的问题,终于解决了。完结,撒花~~~

总结

本文主要讲述了在Android平台使用ndk23交叉编译工具链编译valgrind时遇到的问题及解决方法。主要问题包括不支持Android系统、结构体重复定义、无法找到libgcc.a库以及32位工具编译失败等。作者首先尝试通过修改configure参数和解决依赖问题来解决问题,但在目标机调试时仍然遇到断言错误。随后,作者尝试使用gcc编译而非clang,并找到了一个早期版本的ndk14,最终成功编译并调试了valgrind。

有时换一个思路,也许会让你柳暗花明又一村,拥有意外收获。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全网最详细解法|同济大学|高等数学|第八版|习题1-2

文章目录 同济大学&#xff5c;高等数学&#xff5c;第八版&#xff5c;习题1-2&#xff5c;2.1同济大学&#xff5c;高等数学&#xff5c;第八版&#xff5c;习题1-2&#xff5c;2.2同济大学&#xff5c;高等数学&#xff5c;第八版&#xff5c;习题1-2&#xff5c;2.3同济大学…

[Android] 240204批量生成联系人,短信,通话记录的APK

平常在做测试的时候&#xff0c;需要批量生成很多测试数据&#xff1b; 陌生人 联系人名字的生成支持随机生成&#xff0c;也可以自定义生成&#xff0c;自定义生成陌生人的数据&#xff0c;联系人的名字是否带索引&#xff1b; 通话记录 随机生成通话记录&#xff0c;在生…

Cannot resolve plugin org.apache.maven.plugins:maven-compiler-plugin:3.8.1

目录 【问题描述】maven环境报错 Cannot resolve plugin org.apache.maven.plugins:maven-compiler-plugin:3.8.1 【解决办法】 检查maven路径是否一致 路径一致的话&#xff0c;更改配置文件settings.xml的镜像源。 添加代码到 <mirrors> <!-- 阿里镜像 --> &l…

LLaMA 模型中的Transformer架构变化

目录 1. 前置层归一化&#xff08;Pre-normalization&#xff09; 2. RMSNorm 归一化函数 3. SwiGLU 激活函数 4. 旋转位置嵌入&#xff08;RoPE&#xff09; 5. 注意力机制优化 6. Group Query Attention 7. 模型规模和训练超参数 8. 分布式模型训练 前置归一化与后置…

如何使用第三方API采集电商数据呢?

电商商家最常唠叨的就是店铺运营难做。每日多平台店铺数据统计汇总繁琐耗时&#xff0c;人工效率偏低&#xff0c;且工作内容有限。 特别是眼下“618&#xff0c;双十一&#xff0c;双十二&#xff0c;年底大促”将至&#xff0c;如何提高运营的效率和质量、保证产品及服务的良…

单片机的50个电路

单片机 电源 声音模块 收音机 485 蓝牙 光耦 can 光敏电阻 单片机 矩阵 单片机电路 时钟 ADC 接口电路 红外发射 显示模块 红外接收 蜂鸣器驱动 流水灯 usb供电 烧录电路 数码管 EEPROM LCD1602电路 数码管 max485 红外开关 译码器 移位寄存器 步进电机控制 复位电路 下载电路 …

普渡机器人CEO预测2024年服务机器人市场将扩大

原创 | 文 BFT机器人 根据普渡科技有限公司的报告&#xff0c;商用服务机器人在东亚地区的应用比其他地方更为广泛。然而&#xff0c;预计到2024年&#xff0c;全球其他地区也将迎头赶上。这家总部位于中国深圳的公司自豪地宣称&#xff0c;它已经成为中国最大的此类机器人出口…

SpringCloud + Nacos环境下抽取Feign独立模块并支持MultipartFile

文章目录 一、前提条件和背景1. 前提2. 背景 二、Feign模块1. 依赖引入2. application.yaml配置3. 扩展支持MultipartFile4. 将media-api注册到feign 三、Media模块四、Content模块1. 引入依赖2. 启用FeignClient3. 测试 五、需要澄清的几点 一、前提条件和背景 1. 前提 已经…

JQL语法及Python查询 Jira issue信息

文章目录 一、JQL语法1.1 JQL语法简介1.2 Jira中常用的JQL搜索语句 二、查询issue信息2.1 安装JIRA依赖库2.2 登录JIRA2.3 查询JIRA的project信息2.4 查询JIRA的issue信息2.5 搜索Jira issue 一、JQL语法 1.1 JQL语法简介 JIRA 的 JQL 语法由以下几个元素组成&#xff1a; f…

docker-compose部署laravel项目实战(主机nginx连接项目容器)(详细配置过程)

我用的是主机上的nginx,没有用docker安装nginx&#xff0c; 所以需要先在主机上安装nginx # 更新系统yum sudo yum update# 安装安装包sudo yum install epel-release sudo yum install wget# 安装Nginx sudo yum install nginx #启动 sudo systemctl start nginx #开机自启动…

leetcode (算法)66.加一(python版)

需求 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例 1&#xff1a; 输入&#xff1a;digi…

Mocaverse NFT 概览与数据分析

作者&#xff1a;stellafootprint.network 编译&#xff1a;mingfootprint.network 数据源&#xff1a;Mocaverse NFT Collection Dashboard Mocaverse 是 Animoca Brands 推出的专属 NFT&#xff08;非同质化代币&#xff09;系列&#xff0c;包含 8,888 个独特的 "M…

搜索专项---Flood Fill

文章目录 池塘计数城堡问题山峰与山谷 一、池塘计数OJ链接 1.BFS做法 #include <bits/stdc.h>#define x first #define y secondtypedef std::pair<int,int> PII;constexpr int N1010;int n,m; char g[N][N]; bool st[N][N];//用来表示已经记录过的 std::queue&…

matlab使用jdbc连接数据库

1、打包jdbc 2、在matlab安装目录下&#xff0c;进去toolbox目录下&#xff0c;新建一个对应放jdbc包的文件夹&#xff0c;加入放入的是mysql的jdbc驱动包&#xff0c;就新建一个mysql目录&#xff0c;将驱动包放入mysql目录下 3、在toolbox目录下&#xff0c;找到local目录&a…

李沐《动手学深度学习》循环神经网络 经典网络模型

系列文章 李沐《动手学深度学习》预备知识 张量操作及数据处理 李沐《动手学深度学习》预备知识 线性代数及微积分 李沐《动手学深度学习》线性神经网络 线性回归 李沐《动手学深度学习》线性神经网络 softmax回归 李沐《动手学深度学习》多层感知机 模型概念和代码实现 李沐《…

Linux进程信号(2)--信号的保存

目录 1.阻塞信号 1.1 信号其他相关常见概念 1.实际执行信号的处理动作称为信号递达(Delivery&#xff09; 2.信号从产生到递达之间的状态,称为信号未决(Pending)。 3.进程可以选择阻塞 (Block )某个信号。 1.2信号在内核中的表示 sigset_t 信号集操作函数 使用sigprocm…

ReactNative实现弧形拖动条

我们直接看效果 先看下面的使用代码 <CircularSlider5step{2}min{0}max{100}radius{100}value{30}onComplete{(changeValue: number) > this.handleEmailSbp(changeValue)}onChange{(changeValue: number) > this.handleEmailDpd(changeValue)}contentContainerStyle{…

MicroPython ESP32开发:通过寄存器直接访问外围设备

可以通过直接读写寄存器来控制 ESP32 的外设。这就需要阅读数据手册&#xff0c;了解要使用哪些寄存器以及要写入哪些值。下面的示例展示了如何打开和更改 MCPWM0 外设的预分频器。 from micropython import const from machine import mem32# Define the register addresses …

SpringBoot中数据库的连接及Mybatis的配置和使用

目录 1 在pom.xml中引入相关依赖 2 对数据库进行配置 2.1 配置application.yml 2.2 idea连接数据库 (3.2.1有用到) 3 Mybatis的使用 3.1 测试文件的引入 3.2 使用 3.2.1 使用注解(有小技巧(✪ω✪)) 3.2.2 使用动态sql 1 在pom.xml中引入相关依赖 <dependencies&g…

单片机学习笔记---按键控制LED流水灯模式定时器时钟

目录 代码讲解 初始化函数 1.定时器部分的配置步骤 第一步&#xff0c;对TMOD的赋值 第二步&#xff0c;给TF0赋值 第三步&#xff0c;给TR0赋值开启定时器 第四步&#xff0c;给TL0和TH0赋初值 2.中断系统部分的配置步骤 第一步&#xff0c;给ET0赋值 第二步&#x…