在Android上运行C程序

3

我通过NDK编译了一个简单的C语言程序,并在Android上运行。

C语言源代码:

#include <stdio.h>
int
main ()
{
    printf ("Hello world!\n");
}

编译 C 语言源代码的脚本:

#!/bin/bash
PREFIX="/opt/android-ndk-r7"
CC="$PREFIX/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-arm/bin/arm-linux-androideabi-gcc"
NDK="$PREFIX/platforms/android-14/arch-arm"
CFLAGS="-I$NDK/usr/include"
LDFLAGS="-nostdlib -Wl,-rpath-link=$NDK/usr/lib -L$NDK/usr/lib $NDK/usr/lib/crtbegin_dynamic.o -lc"
$CC -o hello hello.c $CFLAGS $LDFLAGS

当我在Android终端上运行程序时发生了什么:

$ export PATH=/data/local/bin:$PATH
$ hello
Hello world!
[1] + Stopped (signal)        hello
$ exit
You have stopped jobs.
[1]   Illegal instruction      hello
$ exit

当我运行程序时,它能够工作,但接着出现了“停止”和“非法指令”的提示。
我该如何解决这个问题?

当然,在程序中应该使用“return 0;”,但为什么它会崩溃,我不知道。 - Prof. Falken
1
@AmigableClarkKant:在C99中,“return 0;”是隐含的... - Kerrek SB
@KerrekSB,真的吗?这是对所有伟大和真实的侮辱! - Prof. Falken
你如何安装Android NDK工具链? - user1089679
1个回答

0
我同意@Amigable Clark Kent的观点。想一想你手头的东西。
你告诉编译器main()将返回一个int。在运行时,加载器准备从函数接收返回值,但实际上从未返回。无论它是在寄存器还是堆栈中查找,那个位置都会保存错误的内容。

实际上,即使使用“return 0;”,它也会导致错误。唯一的区别是出现了“分段错误”,而不是“非法指令”。 - 5frame
看起来你覆盖了主函数的返回地址。如果问我,这可能与你的链接器有关。 - Neowizard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接