arm下dlsym返回的符号地址居然不是偶对齐的。
我们都知道在写汇编函数过程都会偶对齐,而gcc编译器都会将函数编译为cpu字长对齐的地址。arm指令集是固定32位指令长度,thumb指令集是固定16位指令长度, 但是运行在arm下的程序,dlsym返回的符号地址居然不是对齐的。
先来看现象,下面是从libui库中取两个函数符号。

结果显示为两个奇数地址,这两个地址都在正确的函数地址的基础上加了1。

如果按上面两个函数地址去反汇编的话,一定会得到不正确的反汇编代码。但如果自作聪明将地址手动令其对齐反而会出错。手动将地址对齐(addr & ~3)后再调用就会引起SIGILL或SIGSEGV,诚然我对arm涉足并不深,(也就是基于x86去看arm的代码,也就是翻译成我理解的x86汇编来看arm汇编),当然也就干了上面的事。

dlsym返回的地址被加1,这是有原因的。看下面反汇编出来的代码


从指令地址的偏移规律,可以看出是在使用thumb指令集,从push.w这一指令可以知道还是thumb2模式,'.w'强制thumb模式下某一指令应用32位长度。arm运行在不同模式以执行不同的指令集,而切换这种模式就是BLX或BX跳转指令(函数调用,Branch to register)提供的功能。由于函数地址要求是偶对齐的,所以函数地址的最低位被利用作为控制位,当这个位为1时,BX或BLX指令而进入thumb模式,否则进入arm模式,不同模式下对代码段进行指令译码就会有不同的结果。
指令的官方文档在http://www.keil.com/support/man/docs/armasm/armasm_dom1361289866046.htm
在lldb调试中可以通过help arch查看支持的指令体系,在反汇编时加-A arch选项指定应用的指令集。
如何在调试获知cpu当前执行在哪种模式,可以参考https://stackoverflow.com/questions/22660025/how-can-i-tell-if-i-am-in-arm-mode-or-thumb-mode-in-gdb
就是查看寄存器cpsr的第5位(第0位是末位)是否1, p $cpsr & (1<<5)
lldb也不总会正确反汇编一帧来,



arm下dlsym返回的符号地址居然不是偶对齐的。的更多相关文章
- jz2440: linux/arch/arm/下面的plat-和mach-
jz2440: linux/arch/arm/下面的plat和mach plat-s3c24xxmach-s3c2440mach-s3c2410 ====================== 1. 三 ...
- ubuntu下file_get_contents返回空字符串
ubuntu下file_get_contents返回空字符串 | 浏览:302 | 更新:2014-03-30 10:11 本文起初面临的问题是PHP中SoapClient不好使,最后file_get ...
- iOS7下滑动返回与ScrollView共存二三事
[转载请注明出处] = =不是整篇复制就算注明出处了亲... iOS7下滑动返回与ScrollView共存二三事 [前情回顾] 去年的时候,写了这篇帖子iOS7滑动返回.文中提到,对于多页面结构的应用 ...
- 把ASM下的HDD VM转换成ARM下Managed Disk的SSD VM
在ASM下,要把HDD的VM转换成SSD的VM步骤非常复杂.需要手工把Disk从普通存储账户复制到高级存储账户.再通过这个Disk创建VM. 目前在有了ASM到ARM的迁移工具,以及Managed D ...
- ASP.NET误人子弟教程:在MVC下如何返回图片
这几天忙着一些小事,也没有写什么了,今天,我们来玩一个比较简单的东东.就是在MVC下如何返回图片,相信,在传统WebForm下,大家都晓得怎么弄,方也不限于一种,但是,在架构较为严格的MVC里面,刚开 ...
- 痞子衡嵌入式:超级下载算法RT-UFL v1.0在IAR EW for Arm下的使用
痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> v1.0 版发布近 4 个月了,部分客户已经在实际项目开发调试中用上了这个 ...
- 技术分享 | ARM下中标麒麟系统ky10使用Xtrabackup-8.0.25
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 一.需求背景 查询Percona官方手册,Xtrabackup 8.0可以备份M ...
- ARM异常中断返回的几种情况
在学习韦老师视频中中断异常部分时候,对于发生中断时需要执行的#保存异现场 #恢复现场 中的“返回”弄不清楚,查阅网络文章后,发现一篇概述我觉得我能理解的一篇如下: 重要基础知识:R15(PC)总是 ...
- Spring 框架下Controller 返回结果在EasyUI显示
这几天弄了一下java下的在后台返回数据到jsp页面上的显示: 总结一下: 首先后台方面: @RequestMapping(value="/searchByUserName") @ ...
随机推荐
- Distinct 实现自定义去重
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- ES6基本语法入门
一.用let代替var声明变量 ES5中,我们可以在代码中任意位置声明变量,甚至可以重写已经声明的变量,ES6引入了一个let关键字,它是新的var. let language = 'javascri ...
- Java IO_002.InputStream与OutputStream--字节流对数据的操作(读取与写入)
Java IO之FileInputStream与FileOutputStream对象常用操作 涉及到文件(非文件夹)内容的操作,除了要用到File(见之前文章),另外就必须用到输入流或输出流. 输入流 ...
- 什么是Kafka?
1 kafka 是什么 Apache kafka is a distributed streaming platform,即官方定义 kafka 是一个分布式流式计算平台.而在大部分企业开发人员中,都 ...
- Yii 数据库重连告别General error: 2006 MySQL server has gone away
General error: 2006 MySQL server has gone away 错误原因 制造错误 解决办法 最新办法 错误原因 Mysql has gone away MySQL 服务 ...
- C# leetcode 之 096 不同的二叉搜索树
C# leetcode 之 096 不同的二叉搜索树 题目描述 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 二叉搜索树定义 左子树上所有节点的值小于根节点, 右子树上左右 ...
- Vue中Form表单验证无法消除验证问题
iView的表单api给出了一个resetFields方法,用于重置整个表单输入的内容并清除验证提示. 但是有时候需要只消除部分的iview的resetFields方法源码是这样的resetField ...
- DB2中的MQT优化机制详解和实践
MQT :物化查询表.是以一次查询的结果为基础 定义创建的表(实表),以量取胜(特别是在百万,千万级别的量,效果更显著),可以更快的查询到我们需要的结果.MQT有两种类型,一种是系统维护的MQT , ...
- 第二十九章 System V共享内存
共享内存数据结构 共享内存函数 shmget int shmget(key_t key, size_t size, int shmflg); 功能: 用于创建共享内存 参数: key : 这个共享内存 ...
- git 陷阱小记
1.文件添加陷阱: 1).git 提交命令快捷键: git commit -a -m "",能够跳过git添加文件到暂存目录步骤 2)git add . git commit -m ...