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



我正在自学一些ARM汇编,但我甚至无法运行一个简单的程序。我建立了一个工具链和所有的东西,我的代码编译得很好。然而,当我在带有Android的Galaxy Nexus(我正在测试的唯一平台)上从/data/local/tmp/执行程序时,我总是会收到"Stopped(signal)"和/或"139 Segmentation fault"(通常没有数字)。当我尝试从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 Worldn"); // 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

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

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

使用调试器

它会向您显示错误发生的确切位置,通常或多或少都很清楚发生了什么。

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

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

您需要使用正确的asm指令从函数返回。关于ARM皮层m3 itsbx-lr说明,不确定什么是适合您的平台的。

最新更新