在Linux上运行使用硬浮点选项构建的Neon代码时出现分段错误

在Linux上运行使用硬浮点选项构建的Neon代码时出现分段错误,linux,gcc,assembly,neon,Linux,Gcc,Assembly,Neon,我有一个用neon assembly优化的函数代码。我用gcc构建它,并在cortexa9(硬浮动图像)上运行 当我使用硬浮点选项构建非优化代码(没有汇编的纯c)时,例如: -mapc-march=armv7-a-mtune=cortex-a9-mfloat abi=hard-mfpu=neon,工作正常 当我介绍我的汇编代码并使用以下标志进行汇编时: -march=armv7-a-mfloat abi=hard-mfpu=neon它构建得很好,但给出了一个分段错误 还需要注意的一点是,如果我用

我有一个用neon assembly优化的函数代码。我用gcc构建它,并在cortexa9(硬浮动图像)上运行

当我使用硬浮点选项构建非优化代码(没有汇编的纯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+汇编代码+硬浮点的组合是一个问题。。。 如果您使用过这种/类似的组合,请给出您的建议

编辑
如果汇编代码具有普通指令,如
MOV r0、r1
ADD r1、r2、r2
,则代码会运行,但如果出现任何常量或内存相关操作,如
LDR r1、[r2]
MOV r0、#0
,则会出现分段错误。它是否有助于破译故障?

我怀疑您在调用conventin(特别是堆栈分配)时遇到了问题,但没有足够的信息来说明任何结论


您能在函数中使用GCC内联汇编而不是用汇编编写整个函数吗?然后GCC应该注意对齐和调用约定。内联汇编对于使用NEON SIMD的加速算术应该足够了。

好的,下面是我的发现。 缺少的行是一个属性:

.type   function_name, %function 
如果缺少,还可以检查所需的其他属性。这句话对我有用。
感谢您提供您的答案

我建议您在
gdb
valgrind
下运行它,并查看哪一行生成
SEGFAULT
如果代码共享,将在我的末尾进行调试。您是否尝试使用最新的GCC编译器。我正在使用GCC4.8。。。该代码具有以.text.global function_name等开头的常规指令。请尝试在较低的优化级别。有时,优化器可能会使事情变得复杂!谢谢你的建议。然而,它仍然不起作用。我终于设法让gdb运行起来了。但是在SIGSEGV messageman中没有看到任何有用的细节,您是在哪里找到这些信息的?那把戏使我高兴极了!