Relocations for this machine are not implemented,IDA版本过低导致生成汇编代码失败

目录

1、问题描述

2、安卓app发生崩溃,需要查看汇编代码上下文去辅助分析

3、使用IDA打开.so动态库文件,提示Relocations for this machine are not implemented

4、IDA版本较老,不支持ARM64的指令集,使用7.0版本就可以了

5、找到崩溃的那条汇编指令在目标函数中的位置

6、通过阅读汇编代码上下文,找到崩溃的那条汇编指令对应的C++源代码位置


C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_2276111.html       最近在使用IDA打开一个64位ARM平台编译的.so动态库时,IDA先是提示:Relocations for this machine are not implemented,然后打开后并没有生成汇编代码。经多次尝试和研究得知,是IDA版本太低了,老版本IDA对ARM64指令集支持的有问题或者不支持ARM64指令集,使用7.0及以上的版本就可以了本文详细讲述一下问题的现象以及尝试解决的过程。

1、问题描述

       最近在排查一个安卓app崩溃问题时,需要查看app底层使用C++实现的.so动态库的汇编代码上下文去辅助分析。但是在使用64位版本的IDA打开.so动态库时,先是提示:Relocations for this machine are not implemented

然后打开后并没有生成汇编代码。

2、安卓app发生崩溃,需要查看汇编代码上下文去辅助分析

       安卓app在测试过程中发生了崩溃,并自动生成了包含异常信息的Tombstone文件。打开Tombstone文件,查看到了崩溃时的函数调用堆栈,如下所示:

从上述堆栈可以看出,崩溃发生在libxxservice_hddll.so 动态库(该模块是底层业务库,是用C++语言实现的动态库)中,具体是崩溃在函数CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp中,并看到相对于该函数的偏移值1048(这个是十进制整型值)。仅仅看到崩溃在该函数中,但函数中的代码比较多,从现有信息中无法确定具体是崩溃在哪一行代码上。

       既然有函数名及相对于函数的偏移值,我们可以使用IDA工具打开libxxservice_hddll.so动态库文件定位到CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp(mtmsg::CMtMsg*, unsigned int, unsigned int)+1048这个代码段地址对应那一句汇编代码,然后将汇编代码的上下文与C++源码对应起来看,看看崩溃的汇编代码到底对应哪一行C++源码,可能很快就能确定引发问题的原因了。


       在这里,给大家重点推荐一下我的几个热门畅销专栏:

专栏1:(该专栏订阅量接近350个,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!)

C++软件调试与异常排查从入门到精通系列文章汇总icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据近几年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的实战问题分析实例,带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

专栏中的文章均是通过项目实战总结出来的(通过项目实战积累了大量的异常排查素材和案例),有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2: 

C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域的多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!

专栏3: 

开源组件及数据库技术icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html

以多年的开发实战为基础,分享一些开源组件及数据库技术! 


3、使用IDA打开.so动态库文件,提示Relocations for this machine are not implemented

       当前崩溃发生在libxxservice_hddll.so动态库中,所以我们要用IDA打开该二进制文件,查看相关的汇编代码上下文。libxxservice_hddll.so库是64位的,所以要使用64位版本的IDA打开。我当前使用的IDA版本是Version 6.1.110315 (64-bit),将libxxservice_hddll.so文件拖入到IDA中,会弹出选择文件格式的提示框(一般选择默认的就可以了,IDA会自动识别):

其实这个时候就有疑问了,自动生成的文件类型串为:ELF64 for Unknown CPU [183] (Shared object) [elfldw]即IDA无法识别出编译文件的CPU平台类型,这点就有些奇怪,之前也没遇到过。

       然后打开的过程中又弹出如下的提示框:

大致的意思是,对机器的重新定位没有被执行。然后没管这个提示,继续打开libxxservice_hddll.so文件,打开成功后,点击IDA菜单栏中的Jump -> Jump to function...,在弹出的函数列表窗口中,点击窗口下方的Search按钮,输入tombstone中展示的函数调用堆栈中的函数CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp(上面已经讲了,崩溃就发生在这个函数中,要查看这个函数的汇编代码),搜到了函数:

双击这个条目,IDA就会跳转到函数的汇编代码处,结果看到如下的信息:

并没有看到有效的汇编代码,只是一串数字相关的内容,是二进制机器码?

       现在回过头看,先是弹出Relocations for this machine are not implemented提示,然后没有生成汇编代码,可能是哪里出问题了。

4、IDA版本较老,不支持ARM64的指令集,使用7.0版本就可以了

       首先这个libxxservice_hddll.so文件是没问题的,app程序运行时是可以正常使用的。难道是我的IDA版本太老了?我的IDA版本如下所示:

是2011年的版本,距今已经有十来年了,我们的libxxservice_hddll.so库是在ARM64平台下编译的,是不是老版本的IDA不支持ARM64平台呢?

        于是到网上搜索了一下,下载到了2017年版本的IDA,想看看这个版本能否正常地打开库文件。先是将libxxservice_hddll.so库文件拖入到IDA中,弹出选择文件格式的窗口,如下所示:

从上图得知,IDA识别出了这个二进制文件的平台类型为ARM64,估计既然能识别出来,应该生成汇编代码的。然后待文件打开完成后,搜索CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp函数,查看该函数的汇编代码,看到如下的汇编代码:

所以,IDA7.0是支持ARM64平台的二进制文件的,生成的汇编代码也是正常的。

5、找到崩溃的那条汇编指令在目标函数中的位置

        CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp函数对应的汇编代码如下所示:

       可以看到该函数的函数地址(函数首地址)为0x0000000000074DE8,根据Tombstone文件中显示的相对函数的偏移:

#00 pc 0000000000075200  /xxxkyui/lib64/libxxservice_hddll.so (CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp(mtmsg::CMtMsg*, unsigned int, unsigned int)+1048) (BuildId: d6e3064a3e1a03d9bea3c4496e78cb4942d187d1)

计算新的地址:

0x0000000000074DE8 + 0x418(对应于10进制的1048)=  0x0000000000075200

然后在IDA中搜索该地址0x0000000000075200,找到对应的汇编代码行。具体的做法是,将鼠标点进汇编代码窗口中(使该窗口获得焦点),然后按下快捷键g,弹出Jump to address窗口,输入上面计算出来的地址0x0000000000075200:

点击OK,就会跳转到对应的行,如下所示:

6、通过阅读汇编代码上下文,找到崩溃的那条汇编指令对应的C++源代码位置

        我们平时看惯了X86平台的汇编代码,看这个ARM架构的汇编代码有点不习惯,无论是汇编指令的名称,还是寄存器的名称,都有很大的差异。感觉还是X86平台的汇编代码阅读起来更习惯一些。

       上面我们在汇编代码中定位到了位置,但与汇编代码对应的C++源码是哪一行呢?此外,Release下编译时编译器会对C++代码进行优化(有些变量或函数调用可能会被优化掉),导致汇编代码和C++代码可能是不完全一致的,甚至较难对应起来。

       该怎么将汇编代码与C++源码对应起来呢?难道我们要一句一句汇编代码去啃?强行去阅读汇编代码上下文,是需要有一定的汇编功底的,一般人比较难做到。一般我们借助汇编上下文中的注释信息去辅助阅读,本例中我们就是使用注释信息快读定位的。

一般在阅读汇编代码上下文时,一方面借助汇编代码中的注释,另一方面将汇编代码与C++源码对照着看!

       0x0000000000075200地址对应的汇编代码行,该行代码下面紧接就看到注释,是常量值字符串的注释:

但看不到完整的字符串。这个地方有个技巧,可以将鼠标移动到变量上,就会以TooTip的方式显示变量中的完整内容,如下所示:

这个地方巧了,这样的字符串是打印日志中的,于是到C++源码中找到CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp函数,在函数中找“[CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp] dispatch”这样的打印,确实有这行打印,如下所示:

所以就找到了0x0000000000075200地址对应的C++源码大概的行了,所以本例中的空指针问题应该就是上图中的ptTip指针,即该指针值为空,结果使用该指针调用value接口产生了崩溃。

       关于IDA工具介绍及详细使用说明,可以参见我之前写的文章:

IDA反汇编工具使用详解icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/120635120使用IDA查看汇编代码上下文去辅助排查C++软件异常问题icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/128942626使用反汇编工具IDA查看发生异常的汇编代码的上下文去辅助分析C++软件异常icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/132158574

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

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

相关文章

vue中echarts柱状图点击x轴数据复制

参考自:Vue 3 使用 vue-echarts 的柱状图 barItem 和 x, y 轴点击事件实现_echarts x轴点击事件-CSDN博客 例如柱状图如下: 步骤: 一、数据处理的时候需要在 xAxis 对象中添加:triggerEvent: true 这个键值对,以增加…

vscode如何开发微信小程序?(保姆级教学)

1.安装“微信小程序开发工具”扩展 2.安装“vscode weapp api”扩展 3.安装“vscode wxml”扩展 4.安装“vscode-wechat”扩展 5.在终端执行命令: vue create -p dcloudio/uni-preset-vue uniapp-test uniapp-test就是我这里的项目名称了 6.如果遇到了这个错误&a…

构建平战结合的融合通信指挥调度系统平台

华脉智联PTTLINK融合通信指挥调度系统将语音、视频、GIS进行高度融合,构建“平战结合”的指挥调度模式,既满足平时的日常办公、会议会商、应急培训、应急演练等需求,也能够应对战时的应急指挥、应急救援、应急决策等需求,达到统一…

前端性能监控和错误监控

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

积极办理等保测评,保证企业网络安全!

随着网络的越发普及以及发达,网络安全问题日益突出,保障网络安全越发重要。为了保障网络系统的安全稳定运行,办理等保测评成为了企业和组织必须面对的重要任务。简单来说就是,积极办理等保测评,保证企业网络安全&#…

1005. K 次取反后最大化的数组和 增强for循环(foreach循环)遍历数组

1005. K 次取反后最大化的数组和 原题链接:完成情况:解题思路:参考代码:_1005K次取反后最大化的数组和_1005K次取反后最大化的数组和_简洁写法 错误经验吸取增强for循环(foreach循环)遍历数组 原题链接&am…

Kafka--从Zookeeper数据理解Kafka集群工作机制

从Zookeeper数据理解Kafka集群工作机制 这一部分主要是理解Kafka的服务端重要原理。但是Kafka为了保证高吞吐,高性能,高可扩展的三高架构,很多具体设计都是相当复杂的。如果直接跳进去学习研究,很快就会晕头转向。所以&#xff0c…

亚信科技AntDB数据库——深入了解AntDB-M元数据锁的实现(二)

5.5 防止低优先级锁饥饿 AntDB-M按照优先级将锁又分了两类,用于解决低优先级锁饥饿问题。 ●独占型(hog): X, SNRW, SNW; 具有较强的不兼容性,优先级高,容易霸占锁,造成其他低优先级锁一直处于等待状态。 ●暗弱型(piglet): SW; …

【leetcode876】链表的中间结点Java代码讲解

12.19 链表的中间结点 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一个中间结点&a…

P2P网络下分布式文件共享场景的测试

P2P网络介绍 P2P是Peer-to-Peer的缩写,“Peer”在英语里有“对等者、伙伴、对端”的意义。因此,从字面意思来看,P2P可以理解为对等网络。国内一些媒体将P2P翻译成“点对点”或者“端对端”,学术界则统一称为对等网络(Peer-to-Pee…

Redis7--基础篇9(SpringBoot集成Redis)

1. jedis、lettuce、Redistemplate的关系 第一代为jedis,之后推出了lettuce,然后springboot继承了Redistemplate,现推荐使用Redistemplate。 总的来说,jedis、lettuce、Redistemplate都是java操作Redis数据库的驱动。 2. 本地Ja…

骨传导耳机和开放式耳机有什么区别?一文读懂骨传导耳机和开放式的关系!

先说结论,骨传导耳机和气传导耳机两者都属于是开放式耳机,开放式耳机指的是开放双耳佩戴的耳机! 开放式耳机分为两种,分别是骨传导耳机和气传导耳机,虽然两者都属于开放式耳机,但它们的佩戴方式和传声原理…

【Unity】运行时创建曲线(贝塞尔的运用)

[Unity]运行时创建线(贝塞尔的运用) 1. 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线。 2. 原理介绍 2.1 曲线的创建 unity建立网格曲线可以参考Unity程序化网格体的实现方法。主要分为顶点,三角面&#xff0c…

数据分析为何要学统计学(10)——如何进行比率检验

比率检验是通过样本推测某种事件的总体占比水平。要求事件仅有互斥的两种情况,即,概率分别为p与1-p。 比率检验分单样本和双样本两种情况,以下我们分别介绍。 1. 单样本比率检验 形如这样的问题:“小学生近视比例日益提高&#…

Starting the Docker Engine...一直转圈

出现的问题: 原因排查: 看了网上的很多篇文章,每个原因都排查了,没有发现问题。 遇到这样的情况应先看自己是否安装成功 打开运行,在空框中输入powershell并点击确定: docker version 显示版本证明安装…

2023年国赛高教杯数学建模D题圈养湖羊的空间利用率解题全过程文档及程序

2023年国赛高教杯数学建模 D题 圈养湖羊的空间利用率 原题再现 规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养,适应不同种类、不同阶段的牲畜对空间的不同要求,以保障牲畜安全和健康;与此同时,也要尽量减少空间闲置所…

微服务技术 RabbitMQ SpringAMQP P61-P76

B站学习视频https://www.bilibili.com/video/BV1LQ4y127n4?p61&vd_source8665d6da33d4e2277ca40f03210fe53a 文档资料: 链接:https://pan.baidu.com/s/1P_Ag1BYiPaF52EI19A0YRw?pwdd03r 提取码:d03r 一 初始MQ 1. 同步通讯 2. 异步通讯 3. MQ常…

Jenkins 添加节点报错

报错日志 Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: hudson/remoting/Launcher has been compiled by a more recent version of the Java Runtime (cl…

如何搭建企业管理系统Odoo并远程访问管理界面【内网穿透】

文章目录 前言1. 下载安装Odoo:2. 实现公网访问Odoo本地系统:3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件,是一个一站式全功能ERP及电商平台。 开源性质:Odoo是一个开源的ERP软件,这意味着企…

短视频账号矩阵系统3年技术独立源头正规开发搭建

短视频账号矩阵3年技术独立开发打造是一个非常有挑战性和前景的项目。以下是一些建议,帮助你成功打造一个成功的短视频账号矩阵: 1. 确定目标受众:首先需要明确你的目标受众是谁,了解他们的兴趣爱好、年龄、性别等,以便…