android - 从 C 调用 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 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

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

最佳答案

有一种解决方案适用于大多数情况:

使用调试器

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

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

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

关于android - 从 C 调用 ARM 汇编函数导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17806601/

相关文章:

linux - 如何仅编译 ARM32 二进制文件(没有拇指)

c - 在嵌入式系统中从汇编语言切换到 C 语言

ios - 在iOS aarch64应用程序中使用内联汇编器

android - 如何将2个UDP套接字绑定(bind)到同一个端口,一个用于接收,另一个用于发送

java - Android:应用程序重新启动时下载的文件被删除

c - 如何创建共享头内存exe和dll/共享对象

c - ld : duplicate symbol _dbg_char

android - Android 中的不间断冒号

android - 使用 nutiteq 在 android 中显示 mbtiles 的代码

比较空白和数组