我们都知道在写汇编函数过程都会偶对齐,而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返回的符号地址居然不是偶对齐的。的更多相关文章

  1. jz2440: linux/arch/arm/下面的plat-和mach-

    jz2440: linux/arch/arm/下面的plat和mach plat-s3c24xxmach-s3c2440mach-s3c2410 ====================== 1. 三 ...

  2. ubuntu下file_get_contents返回空字符串

    ubuntu下file_get_contents返回空字符串 | 浏览:302 | 更新:2014-03-30 10:11 本文起初面临的问题是PHP中SoapClient不好使,最后file_get ...

  3. iOS7下滑动返回与ScrollView共存二三事

    [转载请注明出处] = =不是整篇复制就算注明出处了亲... iOS7下滑动返回与ScrollView共存二三事 [前情回顾] 去年的时候,写了这篇帖子iOS7滑动返回.文中提到,对于多页面结构的应用 ...

  4. 把ASM下的HDD VM转换成ARM下Managed Disk的SSD VM

    在ASM下,要把HDD的VM转换成SSD的VM步骤非常复杂.需要手工把Disk从普通存储账户复制到高级存储账户.再通过这个Disk创建VM. 目前在有了ASM到ARM的迁移工具,以及Managed D ...

  5. ASP.NET误人子弟教程:在MVC下如何返回图片

    这几天忙着一些小事,也没有写什么了,今天,我们来玩一个比较简单的东东.就是在MVC下如何返回图片,相信,在传统WebForm下,大家都晓得怎么弄,方也不限于一种,但是,在架构较为严格的MVC里面,刚开 ...

  6. 痞子衡嵌入式:超级下载算法RT-UFL v1.0在IAR EW for Arm下的使用

    痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> v1.0 版发布近 4 个月了,部分客户已经在实际项目开发调试中用上了这个 ...

  7. 技术分享 | ARM下中标麒麟系统ky10使用Xtrabackup-8.0.25

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 一.需求背景 查询Percona官方手册,Xtrabackup 8.0可以备份M ...

  8. ARM异常中断返回的几种情况

    在学习韦老师视频中中断异常部分时候,对于发生中断时需要执行的#保存异现场 #恢复现场 中的“返回”弄不清楚,查阅网络文章后,发现一篇概述我觉得我能理解的一篇如下:   重要基础知识:R15(PC)总是 ...

  9. Spring 框架下Controller 返回结果在EasyUI显示

    这几天弄了一下java下的在后台返回数据到jsp页面上的显示: 总结一下: 首先后台方面: @RequestMapping(value="/searchByUserName") @ ...

随机推荐

  1. pytest中unicode编码问题(如test_fix.py::Test1::test_s1[\u6d4b\u8bd5-\u6d4b\u8bd5])

    现象: 采用如下方式可将其正确显示为中文 ss = r"test_fix.py::Test1::test_s1[\u6d4b\u8bd5-\u6d4b\u8bd5]" print( ...

  2. ride.py打不开RF,而是打开pycharm

    标题中问题的解决方式: 进入到E:\soft\Python\Python36\Scripts,选中ride.py右键-打开方式选择python即可

  3. Spring Boot项目中如何定制拦截器

    本文首发于个人网站:Spring Boot项目中如何定制拦截器 Servlet 过滤器属于Servlet API,和Spring关系不大.除了使用过滤器包装web请求,Spring MVC还提供Han ...

  4. cxf 调用 .net webservice

    1.   问题背景          现在我们两套语言并行,其中必然会涉及到不同系统的相互访问. .net 的会员信息是用 webservice  提供服务的.那如何对现有 .net webservi ...

  5. Java基础(三十一)JDBC(1)常用类和接口

    1.Driver接口 每种数据库的驱动程序都应该提供一个实现java.sql.Driver接口的类.在加载某一驱动程序的Driver类时,它应该创建自己的实例并向java.sql.DriverMana ...

  6. Mysql数据库(五)表记录的检索

    一.基本查询语句 二.单表查询 1.查询所有字段 mysql> SELECT * FROM tb_bookinfo; +----------+-----------+--------+----- ...

  7. Redis(十一)缓存设计

    一.缓存的收益和成本 左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构, 缓存加入后带来的收益如下: 加速读写:因为缓存通常都是全内存的(例如Redis.Memcache),而存储 ...

  8. django-模板之URL标签(五)

    book/views.py from django.shortcuts import render def index(request): return render(request,"in ...

  9. Stringbuilder常用方法

    一.创建Stringbuilder对象StringBuilder strB = new StringBuilder(); 1.append(String str)/append(Char c):字符串 ...

  10. GUI编程(Tkinter) 笔记分享

    Python GUI编程(Tkinter) Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的 ...