当我在 Linux 上运行使用硬浮点选项构建的 Neon 代码时出现分段错误
Posted
技术标签:
【中文标题】当我在 Linux 上运行使用硬浮点选项构建的 Neon 代码时出现分段错误【英文标题】:Segmentation Fault When I run Neon code built with Hard Float option on Linux 【发布时间】:2014-02-19 10:29:55 【问题描述】:我有一个代码,其中一个功能使用霓虹灯组件进行了优化。我使用 gcc 构建它并在 Cortex A9(硬浮点图像)上运行。
当我使用硬浮点选项构建非优化代码(没有汇编的纯 c)时,例如: -mapc -march=armv7-a -mtune=cortex-a9 -mfloat-abi=hard -mfpu=neon ,效果很好。
当我介绍我的汇编代码并使用以下标志进行汇编时: -march=armv7-a -mfloat-abi=hard -mfpu=neon 它构建良好,但会出现分段错误。
还有一点需要注意的是,如果我使用 -mfloat-abi=softfp 代替 hard(并使用 -static 选项链接)构建程序集优化代码,它运行良好。
为什么汇编代码会产生硬浮点问题?我遇到过有关硬/软 abi 选项的其他帖子,但是我没有找到针对我的特定情况的解决方案(C 代码正常工作,但霓虹灯程序集给出了分段错误)
编辑: 该板没有 gdb,我确实通过 gdb 服务器远程尝试,但这引发了其他连接问题。所以我无法使用 gdb 进行调试。然而,我做了什么来调试:一旦我进入汇编函数,我推送寄存器,然后分支到最后并再次弹出寄存器。它仍然给出了分段错误。我可以推断它不是给出错误的特定指令吗? makefile 中缺少某些标志或特定于硬浮点的程序集中的其他形式和语法?
此外,当我使用带有选项 --fpu=vfpv3_d16 的 armcc 构建库时,它仍然可以工作。那是硬浮动对吗?所以我推断 GCC + 汇编代码 + Hard Float 的组合是一个问题...... 如果您使用过这种/类似的组合,请提出您的建议。
编辑
如果汇编代码具有诸如 MOV r0, r1
或 ADD r1, r2,r2
之类的简单指令,则代码将运行,但在任何常量或与内存相关的操作(如 LDR r1, [r2]
或 mov r0, #0
)的情况下会出现分段错误。对破译故障有帮助吗?
【问题讨论】:
我建议你在gdb
或valgrind
下运行,看看哪一行产生SEGFAULT
如果代码是共享的,将在我端调试。您是否尝试过使用最新的 GCC 编译器。
我正在使用 gcc 4.8 ...代码具有以 .text .global function_name 等开头的常用指令。
尝试降低优化级别。有时优化器可能会使事情变得复杂!
感谢您的建议。但是,它仍然无法正常工作。我终于设法让 gdb 运行。但是在 SIGSEGV 消息中看不到任何有用的细节
【参考方案1】:
好的,这就是我发现的。 缺少的一行是一个属性:
.type function_name, %function
如果缺少,也可以检查其他所需的属性。这条线对我有用。 感谢您提供答案
【讨论】:
伙计,你在哪里找到这些信息的?那把戏让我很开心!【参考方案2】:我怀疑您在调用 conventin 时遇到了对齐问题(特别是堆栈分配),但没有足够的信息来说明任何结论。
你可以在你的函数中使用 GCC 内联汇编而不是用汇编编写整个函数吗?然后 GCC 应该注意对齐和调用约定。内联汇编应该足以使用 NEON SIMD 进行加速算术。
【讨论】:
以上是关于当我在 Linux 上运行使用硬浮点选项构建的 Neon 代码时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章
我可以在没有硬编码的情况下在 Windows 上运行的 Java 中构建 Linux 路径吗?