Android 从C调用ARM汇编函数会导致分段错误

Android 从C调用ARM汇编函数会导致分段错误,android,c,assembly,segmentation-fault,arm,Android,C,Assembly,Segmentation Fault,Arm,我在自学一些ARM组装,但我甚至不能运行一个简单的程序。 我建立了一个工具链和所有东西,我的代码编译得很好。然而,当我在装有Android的Galaxy Nexus(我测试的唯一平台)上从/data/local/tmp/执行我的程序时,我总是得到一个“停止(信号)”和/或“139分段错误”(通常没有数字)。当我试图从C代码调用汇编函数时,就会发生这种情况 neontest.c: #include <stdio.h> void neon_test(void); // I also t

我在自学一些ARM组装,但我甚至不能运行一个简单的程序。 我建立了一个工具链和所有东西,我的代码编译得很好。然而,当我在装有Android的Galaxy Nexus(我测试的唯一平台)上从/data/local/tmp/执行我的程序时,我总是得到一个“停止(信号)”和/或“139分段错误”(通常没有数字)。当我试图从C代码调用汇编函数时,就会发生这种情况

neontest.c:

#include <stdio.h>

void neon_test(void); // I also tried variations like extern, but no avail

int main(int argc, char* argv[]) {
    printf("\nHello World\n"); // works just fine
    neon_test(); // segmentation fault
    printf("Done!");
    return 0;
}
.text // added because some wiki said so
.arch armv7a
.fpu neon
.thumb
.syntax unified

.align 4
.global neon_test
.func neon_test
neon_test:
    NOP
.endfunc

.end

我担心这是一个权利问题,但我甚至不知道如何正确识别超出这一点的问题。

有一种解决方案在大多数情况下都有效:

使用调试器 它将向您显示错误发生的确切位置,并且通常或多或少地清楚发生了什么

也就是说,这里有一些猜测:

  • 您确实忘记了@hivert所说的返回(
    BX-LR
  • Thumb函数必须标记为,以便链接器正确处理它。仅仅
    .thumb
    是不够的

  • 您需要使用正确的asm指令从函数返回。在手臂上 bx-lr
    说明,不确定什么是适合您的平台的。您的函数中是否应该至少有一个
    ret
    ?是的,我真的没有理由不使用它。不知何故,BX LR在我试图让它工作的过程中被吞没了,我从未意识到它已经消失了。谢谢你,还有hivert和11temp!伊戈尔,我只是花了一整天的时间与
    .thumb\u func
    这个问题搏斗——我认为这更微妙
    .thumb_func
    是链接函数指针所必需的,而不仅仅是函数本身。例如,中断向量表是一个函数指针表。链接自定义处理程序需要
    .thumb\u func
    ,而链接要在程序中使用的任何普通旧汇编函数则不需要。当然,这只适用于拇指模式。