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

时间:2013-07-23 09:38:08

标签: 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 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;
}

(neontest.h文件目前为空)

neontest_neon.s:

.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

我担心这是一个权利问题,但我不知道如何在这一点之后正确识别问题。

2 个答案:

答案 0 :(得分:1)

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

使用调试器

它将显示错误发生的确切位置,通常或多或少地清楚发生了什么。

那就是说,这里有几个猜测:

  1. 你确实忘记了回归(BX LR),正如@hivert所说。
  2. Thumb函数必须标有.thumb_func,以便链接器正确处理它。仅仅.thumb还不够。

答案 1 :(得分:1)

您需要使用正确的asm指令从函数返回。在ARM cortex m3上它 bx lr 说明,不确定什么是适合您平台的。