2011-12-22 7 views
9

Ho preparato un esempio di codice C al di sotto per farlo girare sul sistema operativo Android seguendo queste procedure,Come si esegue la cross compilazione di eseguibili ELF per Android?

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

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

$ braccio-nessuno-linux-gcc-gnueabi prova -o test.c -Wall

Ho copiato il file binario --test-- nella directory di destinazione "/ system/bin".

Quando tento di fare run binario cross-compilato nel sistema di destinazione, sto ottenendo questo errore

$ PWD

/system/bin

$ ./test

bash: ./test: Nessun file o directory

$ ls -al | Test grep

-rwxr-xr-x 1 0 0 8384 2011-12-22 15:26 prova

anche se il file binario --test-- è già nella directory "/ system/bin" .

mio cross-compilatore è

$ braccio-nessuno-linux-gnueabi-gcc version

braccio-nessuno-linux-gnueabi-gcc (Sourcery G ++ Lite 2009q1-203) 4.3 .3 Copyright (C) 2008 Free Software Foundation, Inc. Software gratuito ; vedere la fonte per le condizioni di copia. Non c'è la garanzia ; nemmeno per COMMERCIABILITÀ o IDONEITÀ PER UN PARTICOLARE SCOPO.

Perché ho ricevuto questo errore?

bash: ./test: No such file or directory

+1

_could_ essere un mancante/caricatore dinamico collegato male o qualcosa del genere. Scopri cosa è il loader con 'readelf'. Prova 'ldd./Test' sul dispositivo. Prova anche a collegare in modo statico l'exe per vedere se almeno funziona. – Mat

+0

In esecuzione 'ls -al | grep date' sul mio telefono restituisce 'lrwxrwxrwx' come permessi. Forse è un problema con le autorizzazioni? –

+1

Come posso rilevare il mio caricatore dinamico corrente? Posso usare l'utility readelf per imparare questo? – albin

risposta

16

Questo problema è stato legato al caricamento dinamico. Quando ho controllato l'output del file binario con readelf, ho notificato che il cross-compiler che utilizzo ha un diverso tipo di caricatore dinamico predefinito - "/lib/ld-linux.so.3", ma Android utilizza "/ system/bin/linker"

$ 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 

per cambiare dynamic loader (linker dinamico), "--dynamic-linker =/path/to/loader" deve essere usata per il linker.

$ braccio-nessuno-linux-gcc-gnueabi prova -o test.c -Wall -Wl, - dinamico-linker =/system/bin/linker

+2

Questo è molto utile per compilare i binari per il file system di ripristino in Android in cui nessun/system/bin/linker è disponibile e il percorso deve essere ridefinito. Grazie. –

Problemi correlati