2011-12-22 12 views
9

私は、それがこれらの手順に従うことにより、Androidのオペレーティングシステム上で実行するためにELF実行ファイルをAndroid用にクロスコンパイルするにはどうすればよいですか?

/*test.c file*/ 
#include <stdio.h> 

int 
main(int argc, char **argv) 
{ 
    printf("Android Test Application.\n"); 
    return 0; 
} 

$アームなし - のlinux-gnueabi-gccの-oテストtest.cのを以下のサンプルCコードを用意しました-Wall

バイナリファイル--test--をターゲットデバイス "/ system/bin"ディレクトリにコピーしました。

私は、ターゲットシステム上のクロスコンパイルされたバイナリの実行を試み

は、私はこのエラーを取得しています

$ PWD

/システム/ binに

$ ./test

bash:./test:そのようなファイルまたはディレクトリはありません。

$ ls -al | "/システム/ binに" ディレクトリに既にある--test--バイナリファイルであるがgrepの試験

-rwxr-XR-X 1 0 0 8384 2011年12月22日午後03時26試験

マイクロスコンパイラである

$アームなし - のlinux-gnueabi-gccの--version

アームなし - のlinux-gnueabi-gccの(のSourcery G ++ Liteの2009q1-203)4.3 .3 著作権(C)2008フリーソフトウェア財団、Inc.これはフリーソフトウェア です。コピー条件についてはソースを参照してください。いいえ 保証はありません。商品性や特定の適合性に関してさえも、 目的には適していません。

なぜこのエラーが発生しますか?

のbash:./test:そのようなファイルやディレクトリはありません

+1

は/欠落し_could_ひどくリンクされたダイナミックローダーまたはそのようなものです。ローダが 'readelf'で何をしているのかを調べてください。デバイス上で 'ldd。/ test'を試してみてください。また、exeファイルを静的にリンクして、それが少なくとも動作するかどうかを確認してください。 – Mat

+0

'ls -al |を実行しています。私の電話で「grep date」を実行すると、権限として 'lrwxrwxrwx'が生成されます。おそらくそのパーミッションの問題? –

+1

現在のダイナミックローダーを検出するにはどうすればよいですか? readelfユーティリティを使ってこれを知ることはできますか? – albin

答えて

16

この問題は、ダイナミックローダーに関連していました。私がreadelfでバイナリファイルの出力をチェックしたとき、私は使用しているクロスコンパイラに別のタイプのデフォルトのダイナミックローダ "/lib/ld-linux.so.3"があることを通知しましたが、Androidでは "/ system/binに/リンカー」

$ readelf --program-headers test 

Elf file type is EXEC (Executable file) 
Entry point 0x8380 
There are 8 program headers, starting at offset 52 
    Program Headers: 
Type   Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align 
EXIDX   0x0004fc 0x000084fc 0x000084fc 0x00050 0x00050 R 0x4 
PHDR   0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4 
INTERP   0x000134 0x00008134 0x00008134 0x00013 0x00013 R 0x1 
     [Requesting program interpreter: /lib/ld-linux.so.3] 
LOAD   0x000000 0x00008000 0x00008000 0x00550 0x00550 R E 0x8000 
LOAD   0x000550 0x00010550 0x00010550 0x00124 0x00128 RW 0x8000 
DYNAMIC  0x00055c 0x0001055c 0x0001055c 0x000f0 0x000f0 RW 0x4 
NOTE   0x000148 0x00008148 0x00008148 0x00020 0x00020 R 0x4 
GNU_STACK  0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 

ダイナミックローダー(動的リンカー)を変更するために、 "--dynamic-リンカー= /パス/に/ローダ" は、リンカーのために使用されるべきです。

$ -Wl -Wallアームなし-Linuxベースgnueabi-GCC -oテストtest.cの、 - 動的リンカー= /システム/ binに/リンカー

+2

これは、/ system/bin/linkerが利用できず、パスを再定義する必要のある、Androidのリカバリファイルシステムのバイナリをコンパイルする場合に非常に便利です。ありがとう。 –

関連する問題