Thumb和ARM指令不能切换问题(error:unsupported interworking call (Thumb -> ARM))

2023-11-14

1、报错现象

xxx.ko:ection 3 reloc 4 sym 'xxxxxx': unsupported interworking call (Thumb -> ARM)

2、报错原因和分析

报错信息的翻译:程序不支持代码交织,thumb态切换arm态失败。首先要知道ARM架构的CPU分ARM态和Thumb态,执行ARM指令的时候是ARM态,执行Thumb指令的时候是Thumb态;ARM架构的CPU是支持ARM指令集和Thumb指令集的,在编译系统内核的时候可以通过编译参数指定编译成ARM指令集还是Thumb指令集。假设内核是按ARM指令集编译,引用的某个驱动ko文件是按Thumb指令集编译,就会出现上面的报错。
总结:报错的原因就是两个库编译时候采用的指令集不同。

3、解决步骤

3.1、确定当前编译采用的指令集

在编译选项中,“-marm"是指定编译成ARM指令集,”-mthumb"是指定编译成Thumb指令集;
(1)如果你有源码,直接去查看编译脚本确定;
(2)如果你只有编译好的库文件,比如.a文件获取.ko文件,尝试用文本编辑软件(natepad++)去打开,在里面查找上面的两个编译选项;

3.2解决方法

解决的思路总体上就是让两个库的指令集兼容:
(1)先确定两个库编译时候采用的指令集;
(2)方案一:两个库采用同样的指令集,在编译选项里采用同样的编译参数,都用"-marm"或者"-mthumb";
(3)方案二:两个库还是采用不同的指令集,但是要额外加上编译参数"-mthumb-interwork",支持代码交织;

3.3、注意事项

上面提到的两种方案都涉及修改当前库编译采用的指令集,修改采用的指令集是有影响的,不同指令集的优缺点是不同的,根据需求来选择。修改完之后测试一下性能,不要看到没有错误打印就觉得这个问题已经解决,修改指令集有可能会导致性能的下降。

4、arm指令集、thumb指令集、thumb2指令集

(1)arm指令集:速度快,占更多空间。每条指令都是 32bit 的,每条指令能承载更多的信息,因此使用最少的指令完成功能, 所以在相同频率下运行速度也是最快的, 但也因为每条指令是32bit 的而占用了最多的程序空间。
(2)thumb指令集:速度相对慢,省空间。每条指令都是16bit 的,每条指令所能承载的信息少,因此它需要使用更多的指令才能完成功能, 因此运行速度慢, 但它也占用了最少的程序空间。
(3)thumb2指令集:arm指令集和thumb指令集的折中,指令集中既有16bit的指令也有32bit的指令。

5、代码交织

编译选项: -mthumb-interwork
所谓代码交织就是生成的目标文件中不同的部分采用了不同的指令集去编译,一部分是arm指令集一部分是thumb指令集。默认情况下,编译选项是-mno-thumb-interwork,是不支持代码交织的,目标文件不能正常运行。要想目标文件支持代码交织只需要在每部分编译的时候加上编译选项: -mthumb-interwork,在使用了 -mthumb-interwork参数后,生成的代码大小将略微增大,执行效率降低,这就是为什么不默认支持代码交织。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Thumb和ARM指令不能切换问题(error:unsupported interworking call (Thumb -> ARM)) 的相关文章

  • 搭建 llvm 学习环境

    1 下载llvm git clone https github com llvm llvm project git 因为国内网络的原因 clone的时候没有反应 可以多此 Ctrl C 重新 clone 2 下载安装cmake 注意 下载的
  • Explicit 关键字简介

    Explicit 关键字简介 explicit关键字用来修饰类的构造函数 表明构造函数是显示的 相对的是implicit关键字 首先这个关键字只能用在类内部的构造函数声明上 而不能用在类外部的函数定义上 它的作用是不能进行隐式转换 clas
  • 前置++和后置++的区别

    今天在阅读 google c 编程风格 的文档的时候 5 10 前置自增和自减 有一句话引起了我的注意 对于迭代器和其他模板对象使用前缀形式 i 的自增 自减运算符 理由是 前置自增 i 通常要比后置自增 i 效率更高 于是我查了查前置 和
  • 编译器与平台相关性

    每种处理器都可能会有自己的汇编语言编译器 而对于同一款处理器来说 针对不同的平台 比如 Windows 和 Linux 也会有不同版本的汇编语言编译器 理论上 不管用的是什么操作系统 Windows 也好 DOS 也好 Linux 也好 只
  • 条件编译小结

    编码的时候经常要用到条件编译 每次都到网上去查比较浪费时间 今天总结一下以备后用 编译器 GCC ifdef GNUC if GNUC gt 3 GCC3 0以上 Visual C ifdef MSC VER 非VC编译器很多地方也有定义
  • 程序分析 clang系列学习 (二)

    clang静态检测 clang API AST匹配部分 UseAfterMoveCheck 问题概述 示例 代码 AST CFG 检测步骤 算法大致流程 代码 这里 我主要通过clang API实现自定义的代码检测工具 采用的方式类似于cl
  • printf标识总结(转)

    printf标识总结 转 Dev C 下基本数据类型学习小结 环境 Dev C 4 9 6 0 gcc mingw32 使用 Wall编译选项 基本类型包括字节型 char 整型 int 和浮点型 float double 定义基本类型变量
  • QT学习总结

    转眼间工作已经三个月了 实习期也已经满了 在这三个月中 对qt的学习遇到了很多问题 也解决了很多问题 也留下了一些现在的未解之谜 在工作中关于qt的一些东西也需要进行一些记录 QT Creator对大于带有两个空格的目录和中文命名的目录不支
  • 关于拷贝构造函数的一些摘要

    拷贝构造函数 经常被称作X X 是一种特殊的构造函数 他由编译器调用来完成一些基于同一类的其他对象的构件及初始化 它的唯一的一个参数 对象的引用 是不可变的 因为是const型的 这个函数经常用在函数调用期间于用户定义类型的值传递及返回 拷
  • 从编译器角度分析C语言中数组名和指针的区别

    数组名和指针是两个往往很容易让人们混淆的概念 很多人以为数组名就是一个指针 也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变 例如你可以写出下面这样的代码 int p p 却不能写这样的代码 int a a 那么数组名跟
  • C++11各编译器支持情况对比

    原文地址 http sd csdn net a 20120813 2808540 html C 11标准在去年8月份获得一致通过 这是自1998年后C 语言第一次大修订 对C 语言进行了改进和扩充 迄今为止已整整一年啦 想知道C 11在这一
  • MPC8314 (e300核) uboot 调试

    历经2个多月 完成了MPC8314最小系统 uboot 及Linux内核和根文件系统的调试 这是我第一次从头开始做小系统和内核的移植工作 虽然调试的比较辛苦 但是收获还是很多的 下面就介绍一下调试的过程和一些原理性的东西 1 MPC8314
  • 拷贝构造函数和赋值构造函数声明为私有的作用

    转贴地址 http blog csdn net winer632 archive 2009 01 12 3762292 aspx 每个类只有一个赋值函数 由于并非所有的对象都会使用拷贝构造函数和赋值函数 程序员可能对这两个函数有些轻视 请先
  • uboot下实现U盘自动升级程序的思路分析(基于USB系统、eMMC系统、FAT32文件系统)

    1 常见的升级方式 1 1 应用程序升级 优点 在图形化界面操作 只需要选中升级文件并点击升级即可 操作简单 缺点 应用程序必须能正常启动 当程序出现bug就不能升级 可靠性差 总结 操作简单 适合用户 1 2 uboot下tftp升级 优
  • Ubuntu18.04 编译安装llvm-clang

    背景知识 LLVM和GCC的区别 传统编译器 传统编译器的工作原理基本上都是三段式的 可以分为前端 Frontend 优化器 Optimizer 后端 Backend 前端负责解析源代码 检查语法错误 并将其翻译为抽象的语法树 Abstra
  • linux下c/c++开发工具集

    clang llvm组合 lldb debugger 代码补全vim clang complete linux开发花环境 vim eclipse kscope kate kdevelop emacs win虚拟机 source insigh
  • C++头文件

    作为一个二手的 net程序员 你看到了C 头文件一定就犯迷糊了 这到底是个啥玩意 再我纠结了24个小时 google20次 度娘10下 看过10来骗文章以后 我可能稍微开窍了 我对C 头文件总结 与 net比较如下 一 C 头文件究竟是什么
  • 源文件字符集,编译器内部字符集,执行字符集,控制台乱码问题,Qt中文问题

    源文件字符集 源文件本身也是文本文件 所以源文件字符集是指源文件保存时采用哪种字符集编码 VC 下源文件默认是gbk编码 如果想要更改 可以通过 文件 高级保存选项 修改某个源文件的编码方式 似乎没有什么选项能够设置创建项目时的源文件编码
  • 编译原理实验一(C-语言词法分析器的编写C语言版本)

    编译原理实验一 C 语言词法分析器的编写C语言版本 一 tiny词法分析程序源代码阅读笔记 重要变量和函数 变量和函数 A 要计算的唯一特性是词法或是被识别的记号的串值 变量t o k e n S t r i n g B 扫描程序使用3个全
  • C++-必知必会_类模板成员特化(条款48)

    类模板成员特化 再提醒一下 虽然模板的特化和类的派生之间没有任何关 系 但在特化模板的时候 不妨借鉴一下派生的精神 也就意味 着一个完全特化或局部特化通常必须重新实现 主模板具备的 所有能力 例1 主模板 template lt typen

随机推荐