我正在尝试为 68000 处理器构建温度控制应用程序。我目前正在使用 GCC 8.2.0。我正在使用 -msoft-float 标志进行编译。但是,浮点库例程似乎被破坏了。例子:
'000174f4 <__ltdf2>:'
'174f4: 4e56 0000 linkw %fp,#0'
'174f8: 4878 0001 pea 1 <ADD>'
'174fc: 2f2e 0014 movel %fp@(20),%sp@-'
'17500: 2f2e 0010 movel %fp@(16),%sp@-'
'17504: 2f2e 000c movel %fp@(12),%sp@-'
'17508: 2f2e 0008 movel %fp@(8),%sp@-'
'1750c: 61ff bsrs 1750d <__ltdf2+0x19>'
'1750e: ffff .short 0xffff'
'17510: fd94 .short 0xfd94'
'17512: 4e5e unlk %fp'
'17514: 4e75 rts'
'17516: 4e71 nop'
有人可以解释为什么会生成此代码或这里发生了什么吗?68000 不会分支到奇数地址。
更新我一直在研究这个,问题似乎是在链接过程中注入的。从 libgcc.a 转储此函数的代码显示以下内容:
`00000000 <__ltdf2>:`
` 0: 4e56 0000 linkw %fp,#0`
`4: 4878 0001 pea 1 <__ltdf2+0x1>`
` 8: 2f2e 0014 movel %fp@(20),%sp@-`
` c: 2f2e 0010 movel %fp@(16),%sp@-`
`10: 2f2e 000c movel %fp@(12),%sp@-`
`14: 2f2e 0008 movel %fp@(8),%sp@-`
`18: 61ff 0000 0000 bsrl 1a <__ltdf2+0x1a>`
`1e: 4e5e unlk %fp`
` 20: 4e75 rts`
所以链接器必须试图填写分支偏移量并搞砸。由于这个函数的来源是一串宏,我不确定它真正想分支到哪里。