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系列第十五章:写一个简单的中间代码生成器IR Generator

    系列文章目录 LLVM系列第一章 编译LLVM源码 LLVM系列第二章 模块Module LLVM系列第三章 函数Function LLVM系列第四章 逻辑代码块Block LLVM系列第五章 全局变量Global Variable LLV
  • C++多态性:虚函数的调用原理

    C 多态性 虚函数的调用原理 多态性给我们带来了好处 多态使得我们可以通过基类的引用或指针来指明一个对象 包含其派生类的对象 当调用函数时可以自动判断调用的是哪个对象的函数 一个函数说明为虚函数 表明在继承的类中重载这个函数时 当调用这个函
  • GDB远程调试技术---基于mini2440

    GDB调试器提供了两种不同的调试代理用于支持远程调试 即gdbserver方式和stub 插桩 方式 这两种远程调试方式是有区别的 gdbserver本身的体积很小 能够在具有很少存储容量的目标系统上独立运行 因而非常适合于嵌入式环境 而s
  • crmeb 前端源码uniapp编译成微信小程序上传开发工具教程

    1 下载登录微信开发工具 下载地址 https developers weixin qq com miniprogram dev devtools download html 推荐使用稳定版 安装完成后后 打开 微信扫码登陆 2 下载HBu
  • 快速排序之“采取“尾递归”和“三数取中”技术的快速排序”

    快速排序之 采取 尾递归 和 三数取中 技术的快速排序 下面针对快速排序进行一些优化 QUICKSORT算法包含两个对其自身的递归调用 即调用PARTITION后 左边的子数组和右边的子数组分别被递归排序 QUICKSORT中的第二次递归调
  • 自己动手写basic解释器(一)

    自己动手写basic解释器 刺猬 http blog csdn net littlehedgehog 注 文章basic解释源码摘自梁肇新先生的 编程高手箴言 据他所说这个代码也是网上摘录的 源码解读参考 java编程艺术 java编程艺术
  • 龙书虎书鲸书啃不动?试试豆瓣评分9.5的猴书

    相传 编译原理界有三大圣书 龙书是为Compilers Principles Techniques and Tools 虎书是为Modern Compiler Implementation in C 鲸书是为Advanced Compile
  • 【Java虚拟机】第三章、jvm运行期优化,解释器,编译器(AOT静态编译,JIT动态编译)

    已经第三章了 看了前两章是不是有点懵 或者开始意识到了什么 或者整个串联起来了 回顾一下 第一张主要讲的是jvm怎么创建 第二章讲的是jvm内存结构 和番外篇class加载过程 那么我们再结合这一章解释器和编译器 静态和动态编译 把他们串到
  • 关于拷贝构造函数的一些摘要

    拷贝构造函数 经常被称作X X 是一种特殊的构造函数 他由编译器调用来完成一些基于同一类的其他对象的构件及初始化 它的唯一的一个参数 对象的引用 是不可变的 因为是const型的 这个函数经常用在函数调用期间于用户定义类型的值传递及返回 拷
  • 全局变量 multiple definition of 问题解决方法

    解决方法 1 给每一个头文件加上条件编译 注 此方法不是解决上述问题的方法 只是解决multiple definition of的一个方法 当多个文件包含同一个头文件时 而头文件中没有加上条件编译 就会独立的解释 然后生成每个文件生成独立的
  • 编译器何时调用默认构造函数

    总的来说 编译器只在它需要的时候才会合成一个默认构造函数 或者扩张所有已存在的构造函数 一个类满足下列其中任何一个条件 1 包含了一个类的对象 这个对象有一个构造函数 包括编译器合成的默认构造函数 2 如果继承自一些基类 其中某些基类有一个
  • Ubuntu18.04 编译安装llvm-clang

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

    llvm之IR设计 引言 1 逻辑关系 2 class Module 3 class IRBuilder 4 class Instruction 5 class Constant 6 class Function 引言 llvm IR是ll
  • linux下c/c++开发工具集

    clang llvm组合 lldb debugger 代码补全vim clang complete linux开发花环境 vim eclipse kscope kate kdevelop emacs win虚拟机 source insigh
  • 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结

    程序占用的内存分为几个部分 各个部分起什么作用 字符数组 字符指针在实现上有什么区别等等 本文对此做了详细阐述 特转载于此 供大家学习参考之用 一个由C C 编译的程序占用的内存分为以下几个部分 1 栈区 stack 由编译器自动分配释放
  • VC文件扩展名一览表

    VC文件扩展名一览表 2003 12 7 23 05 34 阅读589次 APS 存放二进制资源的中间文件 VC把当前资源文件转换成二进制格式 并存放在APS文件中 以加快资源装载速度 BMP 位图资源文件 BSC 浏览信息文件 由浏览信息
  • 使用嵌入式linux完全手册光盘的arm-linux-gcc 遇到问题 自己编译

    Redhat9下重新生成交叉编译器gcc 3 4 5 glibc 2 3 6 看到论坛上有兄弟也遇到 arm linux gcc lib tls libc so 6 version GLIBC 2 4 not found required
  • C# 4.0的一些新特性

    vs2010正式版4月12日发布了 前几天我也下了一个 但这几天都没有时间好好试用一下 今天针对C 语言的新特性使用了一下 感觉还不错 有几个新特性和大家分享一下 希望我没有太火星 一 新关键词 dynamic 在新版本的C 中 dynam
  • make: *** No rule to make target 错误原因、分析和解决办法

    问题描述 在用codewarrior编译的时候 遇到编译器报如下错误 mingw32 make No rule to make target D CW Workspace Renalt PBG BOOT Project Settings L
  • C语言深入学习--checklist4:宏、枚举、switch

    宏 1 宏的本质是什么 函数 语句 类型定义 或者其它 预编译器的文本替换 1 你知道语言设计者为什么设计宏吗 这些原因目前是否成立 在 C程序中 可以用宏代码提高执行效率 宏代码本身不是函数 但使用起来象函数 预处理器用复制宏代码的方式代

随机推荐