Arm ABI呼叫“aeabi”idivmod不';I don’我没有表现得像预期的那样

Arm ABI呼叫“aeabi”idivmod不';I don’我没有表现得像预期的那样,arm,abi,stm32f4discovery,Arm,Abi,Stm32f4discovery,我正试图在裸机架构(带ARM cortex-m4f处理器的stm32f4板)上开发一个程序。我在ABI呼叫中遇到了一个奇怪的问题。 调用是由编译器生成的,因为在代码中多次使用了%操作数。奇怪的是,如果我查看使用objdump编译生成的.elf转储,我得到的结果是: 080080e0 <__aeabi_idivmod>: 80080e0: e3510000 cmp r1, #0 80080e4: 0afffff9 beq 80080d0 <.divsi3_

我正试图在裸机架构(带ARM cortex-m4f处理器的stm32f4板)上开发一个程序。我在ABI呼叫中遇到了一个奇怪的问题。 调用是由编译器生成的,因为在代码中多次使用了%操作数。奇怪的是,如果我查看使用objdump编译生成的.elf转储,我得到的结果是:

080080e0 <__aeabi_idivmod>:
 80080e0:   e3510000    cmp r1, #0
 80080e4:   0afffff9    beq 80080d0 <.divsi3_skip_div0_test+0x110>
 80080e8:   e92d4003    push    {r0, r1, lr}
 80080ec:   ebffffb3    bl  8007fc0 <.divsi3_skip_div0_test>
 80080f0:   e8bd4006    pop {r1, r2, lr}
 80080f4:   e0030092    mul r3, r2, r0
 80080f8:   e0411003    sub r1, r1, r3
 80080fc:   e12fff1e    bx  lr
有没有关于我做错了的线索?任何帮助都将不胜感激

编辑:我正在使用此编译器:

EDIT2(跟随Notlikethat的响应):我用来链接我的程序的命令如下:

$(ARMGNU)-ld -o program.gcc.thumb.elf -T memmap vectors.o program.gcc.thumb.o   $(OBJS2)     $(LIBGCC)
memmap是链接器脚本,vectors.o包含启动代码,$(OBJS2)包含所有必须链接在一起的对象文件,$(LIBGCC)是引用包含我们正在讨论的ABI调用的库的变量。从notliketh的评论中我了解到,我应该在这里添加一些选项,强制将libgcc编译为thumb代码,而不是普通的ARM代码。我已尝试向链接器添加这些选项,但在这两种情况下都会出现相同的错误:

arm-none-eabi-ld: unrecognised emulation mode: cpu=cortex-m3
Supported emulations: armelf

EDIT3:我只是在这一刻才意识到我的板处理器是cortex-m4f而不是cortex-m3。我认为这不会有太大的不同。

问题是,默认情况下,您的工具链的标准库编译为ARM指令-由于Cortex-M处理器只支持Thumb-2*,因此在尝试使用ARM代码的交互分支时,它们会出现故障

现在,
-mthumb
选项告诉编译器将代码编译到Thumb——标准库是预编译的,直到链接时才出现。幸运的是,他说工具链支持多库,所以您可以选择合适的库,而不必找到v7-M特定的工具链

根据我对multilib内部工作原理的理解,您必须提供它所寻找的选项的精确神奇组合,在本例中,这些选项可以是:

-mthumb -mcpu=cortex-m4
或:

这将导致GCC为链接器提供一个适当兼容的库,而不是默认库(如果您也需要浮点支持,文档中还列出了其他选项)

如果您使用单独的链接步骤,我相信您需要使用
gcc
作为链接命令来代替
ld
,以使多库正确工作-这当然是我这里的Linaro工具链的情况(它只有双向硬浮动/ARMv4+软浮动多库)



*严格地说,不是全部的Thumb-2

好吧,这种反汇编是ARM指令,当M3试图以Thumb方式执行它们时,这是毫无意义的。您使用的编译器/库是什么?(除了“错误的一个”)谢谢你的回答,我会用所需的信息更新帖子。无论如何,我正在使用这个编译器:以及它提供的库。此外,我对ARM汇编不太了解,无法区分普通ARM指令和Thumb指令,但我已经使用-mthumb选项编译了所有文件,所以它们应该编译为Thumb指令。首先感谢您的回答,我不知道这个事实。由于评论的空间不适合我的回复,我将在上面更新我的帖子。@user3768186更新了答案。为了清晰起见,我省略了交叉编译器前缀,但显然您仍然需要它。主机
gcc
无法工作;)是的,我正在使用一个单独的链接步骤,目前我已经解决了向链接器传递正确的libgcc的问题(实际上错误是因为我传递了错误的libgcc)。我知道这并不理想,正确的解决方案是你建议的。
arm-none-eabi-gcc --version
arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.8.3 20131129 (release)     [ARM/embedded-4_8-branch revision 205641]
$(ARMGNU)-ld -o program.gcc.thumb.elf -T memmap vectors.o program.gcc.thumb.o   $(OBJS2)     $(LIBGCC)
arm-none-eabi-ld: unrecognised emulation mode: cpu=cortex-m3
Supported emulations: armelf
-mthumb -mcpu=cortex-m4
-mthumb -march=armv7e-m