分段错误当我在Linux上运行使用Hard Float构build的Neon代码时

我有一个代码与霓虹灯assembly优化的一个function。 我用gcc构build它,并运行在Cortex A9(硬浮动图像)上。

当我build立一个非优化代码(纯C没有汇编)与硬浮选项,如:-mapc -march = armv7-a -mtune = cortex-a9 -mfloat-abi = hard -mfpu = neon,它工作正常。

当我介绍我的汇编代码,并用下列标志进行汇编:-march = armv7 -a -mfloat-abi = hard -mfpu = neon它构build得很好,但是出现了分段错误。

还有一点需要注意的是,如果我使用-mfloat-abi = softfp代替hard(和带有-static选项的链接)来构build程序集优化代码,则运行良好。

为什么汇编代码会造成Hard float问题? 我遇到了硬/软abi选项上的其他post,但是我没有find解决scheme,我的具体情况(C代码工作,但霓虹灯大会给分段错误)

编辑:董事会没有gdb,我通过gdb服务器远程尝试,但提出了其他连接问题。 所以我不能使用gdb进行debugging。 但是,我所做的debugging:只要我进入汇编函数,我推寄存器,然后分支到最后,再次popup寄存器。 它仍然给分段错误。 我可以推断,这不是一个特定的指示给予错误。 一些标志丢失在生成文件或其他forms和特定于硬浮点的程序集中的语法?

另外,当我使用armcc选项–fpu = vfpv3_d16构build库时,它仍然可以工作。 这是很难对付的吗? 所以我推断组合GCC +汇编代码+硬盘浮动是一个问题…请给你的build议,如果你曾经与这个/类似的组合。

编辑如果汇编代码中包含像MOV r0, r1ADD r1, r2,r2这样的明确指令,则会运行该代码ADD r1, r2,r2但在出现与LDR r1, [r2]mov r0, #0一样的任何常量或内存相关操作的情况下会出现分段错误。 这有助于破译错误吗?

好的,这是我发现的。 缺失的线是一个属性:

 .type function_name, %function 

也可以检查所需的其他属性,如果失踪。 这条线为我工作。 感谢您提供您的答案

我怀疑你在调用conventin(特别是堆栈分配)方面有问题,但没有足够的信息来说明任何结论。

你可以在你的函数中使用GCC内联汇编而不是用汇编编写整个函数吗? 然后海湾合作委员会应该照顾对齐和调用惯例。 内联程序集应该足够用于NEON SIMD的加速算法。