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") @ ...
随机推荐
- 元素定位之css选择器(2)
理论学习地址:https://www.runoob.com/cssref/css-selectors.html 定位思路: 先在单元素范围内选择查找id或name,定位不到的话往上查扩大范围 使用实例 ...
- Spring Boot2 系列教程(十七)SpringBoot 整合 Swagger2
前后端分离后,维护接口文档基本上是必不可少的工作. 一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了.当然这是一种非常理想的状态,实际开发中却 ...
- 我遇到的一些Git问题汇编
问题一: failed to push some refs to git hint: Updates were rejected because the remote contains work th ...
- 像使用SQL一样对List对象集合进行排序
在开始之前,我先卖个关子提一个问题:假设我们有一个Movie类,这个类有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分).你知道怎么对一个Movie对象组 ...
- FormData交互以及Node multiparty插件的使用
一.FormData FormData是ajax2.0里面添加的新特性. FormData的主要用途有两个: (1).将form表单元素的name与value进行组合,实现表单数据的序列化,从而减少表 ...
- 仿写vue UI 组件总结 (自己练习,仿照现有的UI组件)
UI组件 Vue开发插件流程 本来是昨天要写总结的,感觉自己写不好,就放弃了.今天看到了iview和element有一些摩擦,是关于代码借鉴的问题(哈哈),不做评价.谁下生会写组件,我仿(chao)写 ...
- django-模板之URL标签(五)
book/views.py from django.shortcuts import render def index(request): return render(request,"in ...
- 第一篇 Flask初识
一. Python 现阶段三大主流Web框架 Django Tornado Flask 对比 1.Django 主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不 ...
- ubuntu & centos RTL88x2BU 无线网卡驱动(v5.1.7_19806) 安装
前提 大部分情况都是因为当前系统的内核不满足驱动文件的编译条件,可以通过驱动文件中的文档来确定是否要升级内核还是降级内核, 对于升级内核只需要下载指定的内核版本安装即可,降级内核(暂时不清楚是否会 ...
- JavaSE语法(中)
6.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 是值传递.Java语言的方法调用支持参数的值传递.当一个对象实例作为一个 ...