对于GNU编译器中“-mthumb-interwork”和“-mthumb”的理解
来源:互联网 发布:客户达装修软件 编辑:程序博客网 时间:2024/05/25 05:37
最近一直在ARM代码和Thumb代码之间打转,这两个编译选项可以说是放眼皆是,但一直没有对其进行深入的理解,这个还是比较大的影响我对于更深入的内容的分析。花一点时间,归纳如下。
"-mthumb-interwork”的意义是:使用这个编译选项生成的目标文件,允许在ARM和Thumb之间交叉调用。但需要说明的是,加入这个选项之后,编译器生成的目标文件既可能是ARM的,也有可能是Thumb的,这个要根据其他的编译选项的情况而定。
"-mthumb”的意义是:使用这个编译选项生成的目标文件是Thumb的,目前还没有发现GNU编译器中有哪一个选项可以指定生成的目标文件是thumb-2的。
于是乎,一个自然而然的问题就是:"-mthumb-interwork -mthumb”编译选项生成的目标文件就是thumb的,但是可以被其他的ARM的目标文件交叉调用。
举一下的例子(来源于网络)
"-mthumb-interwork”的意义是:使用这个编译选项生成的目标文件,允许在ARM和Thumb之间交叉调用。但需要说明的是,加入这个选项之后,编译器生成的目标文件既可能是ARM的,也有可能是Thumb的,这个要根据其他的编译选项的情况而定。
"-mthumb”的意义是:使用这个编译选项生成的目标文件是Thumb的,目前还没有发现GNU编译器中有哪一个选项可以指定生成的目标文件是thumb-2的。
于是乎,一个自然而然的问题就是:"-mthumb-interwork -mthumb”编译选项生成的目标文件就是thumb的,但是可以被其他的ARM的目标文件交叉调用。
举一下的例子(来源于网络)
// // file: arm.c (instruction length: 32-bit) // extern int thumb_func( void ); int main( void ) { return( thumb_func() ); } // // file: thumb.c (instruction length: 16-bit) // int thumb_func( void ) { return( 0xdeadbeef ); } // // how to build: // arm-elf-gcc -mthumb-interwork -c arm.c -o arm.o arm-elf-gcc -mthumb-interwork -mthumb -c thumb.c -o thumb.o arm-elf-gcc -mthumb-interwork arm.o thumb.o -o a.out
简单说明一下。一般我们因为种种原因需要将工程中的一部分文件编译为ARM,一部分编译为Thumb时, 我们往往是将ARM的目标文件作为一个.o,Thumb的目标文件作为另一个.o。就像上面的例子中,将arm.c编译为arm.o,将thumb.c便以为thumb.o。只是在这两部分的编译选项中都加入"-mthumb-interwork”这样就可以在后面将这两部分合并为(实际上是链接为)一个可执行文件。
0 0
- 对于GNU编译器中“-mthumb-interwork”和“-mthumb”的理解
- gcc mthumb + O2 + mfast-math 选项测试
- 关于初次搭建环境切换老版本出现错误gcc: error: unrecognized command line option ‘-mthumb’的解决方案
- 对于Android NDK编译器ARM和Thumb模式的理解及Toolchain的切换clang编译器
- GNU的编译器和调试工具
- 命令行使用GNU编译器和Microsoft编译器
- 对于C#中委托和事件的理解
- 对于java中classpath和path的理解
- 对于OpenGL中光照和颜色混合的理解
- OpenCV中对于cvCreateImage和cvReleaseImage的一些小理解
- opengl中对于glLookAt()和glOrtho()两个函数的理解
- 对于C++中static_cast和dynamic_cast的理解
- 对于angular 中MVC 和 MVVM 的一些个人理解
- 对于C++中引用和指针的理解
- 对于Python中@property的理解和使用
- gcc, g++ - GNU 工程的 C 和 C++ 编译器
- GNU的g++编译器备忘
- java 中对于接口的理解和我对java 的一些理解
- centos中子目录新生成文件或目录具有与父目录相同权限方法
- jQuery实现编辑修改表格table
- TCP和UDP概念
- DOCTYPE 声明的作用是什么? 严格模式与混杂模式如何区分?
- fastjson自定义序列化
- 对于GNU编译器中“-mthumb-interwork”和“-mthumb”的理解
- OpenWrt笔记---lua环境搭建
- linux挂载新硬盘
- iOS 打包后 Export 导出4 个选项的含义
- Mac 下使用Xcode 配置Lua 环境并使用
- java poi 生成excel双表头
- 欢迎使用CSDN-markdown编辑器
- spring aop拦截Controller做参数校验
- 创建一个WiFi热点