对于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的目标文件交叉调用。


       举一下的例子(来源于网络)

// // 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
原创粉丝点击