2011-12-12 11 views
3

Android用のシンプルなCプログラムをNDK経由でコンパイルし、アンドロイドで実行しました。AndroidでCプログラムを実行中

Cソース:コンパイルCソースの

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

スクリプト:

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

私はプログラムにそれを実行したとき:私はAndroid上で、端末上でプログラムを実行したときに何が起こった

#!/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 

"Stopped"と "Illegal instruction"が発生しました。
この問題を解決するにはどうすればよいですか?

+0

もちろん、 "return 0;"あなたのプログラムでは、なぜそれがクラッシュするのかわかりません。 –

+1

@AmigableClarkKant:C99では、 'return 0;'が暗示されています... –

+0

@KerrekSB、本当ですか?偉大で真実なのは何の侮辱なのですか? –

答えて

0

私は@Amigable Clark Kent with this with thisです。あなたが持っているものを考えてみてください。
main()がintを返すことをコンパイラに伝えます。実行時に、ローダーは関数から返された値を受け取る準備をしていますが、実際には返されません。レジスターやスタックでそれを探しているのかどうかは関係ありません。その場所は間違ったものを保持しています。

+0

実際には、 "return 0;"でもエラーが発生します。違いは、「不正な命令」の代わりに「セグメンテーション違反」が発生したことだけです。 – 5frame

+0

main()戻りアドレスの値を上書きしたようです。あなたが私に尋ねるなら、おそらくあなたのリンカに関係しているでしょう – Neowizard

関連する問題