web-dev-qa-db-ja.com

Android arm-linux-gnueabi-gccを使用した静的C hello worldのクロスコンパイル

NDKスタンドアロンツールチェーンまたはCodesourceryを使用するのではなく、arm-linux-gnueabi-gccを使用してCから静的なHello Worldを構築したいです。

Ubuntuでは...

私は次のことをしました:

Sudo apt-get install gcc-arm-linux-gnueabi

次のようなhi.cを作成しました。

#include <stdio.h>

int main(int argc, char** argv) {
   printf("hello world\n");
   return 0;
}

私はこれを次のようにコンパイルしました:

arm-linux-gnueabi-gcc -static hi.c -o hi 

このようなエミュレータで実行しました:

adb Push hi /data/hi
adb Shell /data/hi

しかし、私はこれを得る:

[1]   Illegal instruction     /data/hi

どのステップを忘れましたか?過去の経験に基づいて、この「すべき」は機能したはずですが、明らかにこれを台無しにしました。

35
corbin

Debianマシン(私の場合はVM)でこれを行うと、すべてうまくいきます。私はubuntuで同様のことをするのが間違っているときはわかりません。レオが提案したとおりかもしれませんが、私は確認できません。これはあなたのために働くはずです。

http://www.cnx-software.com/2012/01/16/installing-emdebian-arm-cross-toolchain-in-debian/

誰かがこのリンクを追加しましたが、説明で述べたツールチェーンを使用していません。誰かが興味を持っている場合に備えて、それを残します。

http://tariqzubairy.wordpress.com/2012/03/09/arm-binaries-static-library-for-Android/

3
corbin

Architecture/cpuを指定してみてください。コンパイラがエミュレータが処理できるよりも高いアーキテクチャバージョンでコードを作成しているようです。

これはうまくいくかもしれません:

arm-linux-gnueabi-gcc -static -march=armv5 hi.c -o hi
14
Leo

それはubuntuデスクトップ上のCodeBenchコンパイラで私のために働いた。 https://sourcery.mentor.com/sgpp/lite/arm/portal/release2029

このコマンドで静的バイナリを作成するだけです:

arm-none-linux-gnueabi-gcc -o hello -static hello.c

次に、adb Push hello/data

adb Shell $ ./data/helloに移動します。これにより、端末にHello Worldが出力されます。電話からも同じことができます。ターミナルエミュレータまたはSL4A bashシェルを使用して実行します。

9
Srikant

私の知る限り、Android内で、何らかの形式のgcc-arm-linux-androideabiでコンパイルされていないユーザーランドアプリケーションを実行することはできません。

1
HacDan

あなたのコードは実際に私のために動作します。

Ubuntuでコンパイルし、/ data/local/tmpにプッシュしました

そして、chmod 777 hi

最後にうまくいきます。

0
Andong Zhan