安卓平台valgrind交叉编译

背景

通过上次的文章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。

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

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

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

相关文章

微信小程序checkbox多选

效果图 <view class"block"><view class"header"><view class"header-left"><text class"pu-title">数据</text><text class"pu-tip">至少选择一个指标</text></view>&l…

JS 基本语句

函数调用&#xff0c;分支&#xff0c;循环&#xff0c;语句示例。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

如何在Vue应用程序中使用Vue-Router来实现路由嵌套动画效果

Vue-Router是Vue.js官方的路由管理插件&#xff0c;可以帮助我们轻松管理应用程序的路由。除了基本的路由功能外&#xff0c;Vue-Router还允许我们在切换路由时添加动画效果&#xff0c;提升用户体验。本文将介绍如何使用Vue-Router来实现路由嵌套动画效果&#xff0c;并提供具…

vscode 括号 python函数括号补全

解决方法 在setting.json中添加 “python.analysis.completeFunctionParens”: true 打开设置&#xff1b; 点击图中按钮打开setting.json文件 添加 “python.analysis.completeFunctionParens”: true

在 iOS 上安装自定企业级应用

了解如何安装您的组织创建的自定应用并为其建立信任。 本文适用于学校、企业或其他组织的系统管理员。 您的组织可以使用 Apple Developer Enterprise Program 创建和分发企业专用的 iOS 应用&#xff0c;以供内部使用。您必须先针对这些应用建立信任后&#xff0c;才能将其打…

电气器件系列四十六:固态继电器规格参数

ssr选型的时候&#xff0c;要和温控器的参数对应起来&#xff0c;我选的温控器&#xff08;ai-207d1g&#xff09;上&#xff0c;明确给出了给ssr的电压数据&#xff08;5vdc&#xff0c;30ma&#xff09;&#xff0c;买的这个ssr(ssr40n)是3-32v&#xff0c;8ma的. 关断电压&a…

Elasticsearch:使用 Inference API 进行语义搜索

在我之前的文章 “Elastic Search 8.12&#xff1a;让 Lucene 更快&#xff0c;让开发人员更快”&#xff0c;我有提到 Inference API。这些功能的核心部分始终是灵活的第三方模型管理&#xff0c;使客户能够利用当今市场上下载最多的向量数据库及其选择的转换器模型。在今天的…

IDEA如何进行远程Debug调试(二)解决jar包运行报错的问题

一、解决jar包运行报错的问题 上文提到在进行debug远程调试的时候&#xff0c;打包后的jar包本地无法运行&#xff0c;报如下的错误 ​​​​​​​IDEA如何进行远程Debug调试-CSDN博客 查看报错是找不到对应的类&#xff0c;那么我们使用jd-gui的反编译工具&#xff0c;看看…

Linux的库文件

概述&#xff1a; 库文件一般就是编译好的二进制文件&#xff0c;用于在链接阶段同目标代码一块生成可执行文件&#xff0c;或者运行可执行文件的时候被加载&#xff0c;以遍调用库文件中的某段代码。 动态链接都是索引的.so文件&#xff0c;静态链接都是压缩打包的.a文件。 …

机器学习本科课程 大作业 多元时间序列预测

1. 问题描述 1.1 阐述问题 对某电力部门的二氧化碳排放量进行回归预测&#xff0c;有如下要求 数据时间跨度从1973年1月到2021年12月&#xff0c;按月份记录。数据集包括“煤电”&#xff0c;“天然气”&#xff0c;“馏分燃料”等共9个指标的数据&#xff08;其中早期的部分…

Electron实战(一):环境搭建/Hello World/打包exe

文章目录 Electron安装Node.jsNodeJs推荐配置开始Electron项目创建index.js文件创建src目录运行打包生成exe生成安装包踩坑 下一篇Electron实战(二)&#xff1a;将Node.js和UI能力&#xff08;app/BrowserWindow/dialog)等注入html Electron Electron是一个使用JavaScript, HT…

ubuntu 18.04修改网卡名称

1.原来网卡配置 现在要把enp3s0的名称改为eth0 2. 总共修改三个文件 第一个修改 sudo vi /etc/default/grub 添加最后一行 GRUB_CMDLINE_LINUX"net.ifnames0 biosdevname0" 第二个修改sudo vi /etc/udev/rules.d/70-persistent-net.rules 如果没有就新建文件&a…

Sqli靶场23-->30

不知不觉鸽了几天了&#xff0c;没办法去旅游摸鱼是这样的了&#xff0c;抓紧时间来小更一下 23.过滤注释符号 先手工注入一下&#xff0c;就能发现两个单引号不报错&#xff0c;但是一旦上到注释符号的话就会报错&#xff0c;可以猜测出是对注释符号进行了过滤&#xff0c;我…

SQL--图形化界面工具

1.图形化界面工具 上述&#xff0c;我们已经讲解了通过DDL语句&#xff0c;如何操作数据库、操作表、操作表中的字段&#xff0c;而通过DDL语句执 行在命令进行操作&#xff0c;主要存在以下两点问题&#xff1a; 1).会影响开发效率 ; 2). 使用起来&#xff0c;并不直观&…

YOLOv5改进 | 损失函数篇 | 更加聚焦的边界框损失Focaler-IoU | 二次创新Inner-FocalerIoU

一、本文介绍 本文给大家带来的改进机制是更加聚焦的边界框损失Focaler-IoU以及我二次创新的InnerFocalerIoU同时本文的内容支持现阶段的百分之九十以上的IoU,比如Focaler-IoU、Focaler-MpdIoU、Innner-Focaler-MpdIoU、Inner-FocalerIoU包含非常全的损失函数,边界框的损失函…

4.0 HDFS 配置与使用

之前提到过的 Hadoop 三种模式&#xff1a;单机模式、伪集群模式和集群模式。 单机模式&#xff1a;Hadoop 仅作为库存在&#xff0c;可以在单计算机上执行 MapReduce 任务&#xff0c;仅用于开发者搭建学习和试验环境。 伪集群模式&#xff1a;此模式 Hadoop 将以守护进程的…

Pytest测试用例参数化

pytest.mark.parametrize(参数名1,参数名2...参数n, [(参数名1_data1,参数名2_data1...参数名n_data1),(参数名1_data2,参数名2_data2...参数名n_data2)]) 场景&#xff1a; 定义一个登录函数test_login,传入参数为name,password&#xff0c;需要用多个账号去测试登录功能 # …

数据库管理phpmyadmin

子任务1-PHPmyadmin软件的使用 本子任务讲解phpmyadmin的介绍和使用操作。 训练目标 1、掌握PHPmyadmin软件的使用方法。 步骤1 phpMyAdmin 介绍 phpmyadmin是一个用PHP编写的软件工具&#xff0c;可以通过web方式控制和操作MySQL数据库。通过phpMyAdmin可以完全对数据库进行…

智慧港口:山海鲸可视化引领未来

随着疫情的结束&#xff0c;全球贸易迎来新的春天&#xff0c;港口作为物流枢纽的地位日益凸显。然而&#xff0c;传统港口的运营和管理方式已无法满足现代物流的需求。为了提高港口运营效率&#xff0c;降低成本&#xff0c;智慧港口的概念应运而生。作为山海鲸可视化的开发者…

《Python 网络爬虫简易速速上手小册》第3章:Python 网络爬虫的设计(2024 最新版)

文章目录 3.1 设计高效的爬取策略3.1.1 重点基础知识讲解3.1.2 重点案例&#xff1a;使用 Scrapy 框架进行并发爬取3.1.3 拓展案例 1&#xff1a;使用 Requests 和 gevent 进行异步请求3.1.4 拓展案例 2&#xff1a;利用缓存机制避免重复请求 3.2 管理爬虫的请求频率3.2.1 重点…