当我在 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, r1ADD r1, r2,r2 之类的简单指令,则代码将运行,但在任何常量或与内存相关的操作(如 LDR r1, [r2]mov r0, #0 )的情况下会出现分段错误。对破译故障有帮助吗?

【问题讨论】:

我建议你在gdbvalgrind下运行,看看哪一行产生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和Linux上确保相同的浮点行为?

我可以在没有硬编码的情况下在 Windows 上运行的 Java 中构建 Linux 路径吗?

SylixOS 在 t_main 中使用硬浮点方法

熊猫浮点错误

我的应用程序在设备上运行缓慢是因为我使用的图像以及如何删除硬编码的宽度和高度

如何在i.MX6UL平台上实现硬浮点与软浮点?