2011-12-22 9 views
9

he preparado un código C muestra abajo para hacer que se ejecute en el sistema operativo Android siguiendo estos procedimientos,¿Cómo se cruzan los archivos ejecutables ELF para Android?

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

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

$ brazo-no-Linux-gnueabi-gcc -o test.c prueba -Wall

He copiado el archivo binario --test-- en el directorio del dispositivo de destino "/ system/bin".

Cuando intento hacer carrera binaria-cruz compilada en el sistema de destino, que estoy recibiendo este error

$ PWD

/system/bin

$ ./test

bash: ./test: Ningún archivo o directorio

$ ls -al | grep prueba

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

aunque el archivo binario --test-- ya está en el directorio "/ system/bin" .

Mi compilador cruzado es

$ brazo-ninguno-linux-gcc-gnueabi --version

brazo-ninguno-linux-gcc-gnueabi (Sourcery G ++ Lite 2009q1-203) 4,3 .3 Copyright (C) 2008 Free Software Foundation, Inc. Este es el software gratuito; ver la fuente de las condiciones de copia. No hay garantía de ; ni siquiera para COMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO EN PARTICULAR .

¿Por qué me aparece este error?

bash: ./test: No existe el fichero o directorio

+1

_could_ ser una falta/cargador dinámico mal vinculado o algo así. Averigüe qué es el cargador con 'readelf'. Pruebe 'ldd./Test' en el dispositivo. Pruebe también el enlace estático del exe para ver si al menos funciona. – Mat

+0

Ejecutando 'ls -al | grep date' en mi teléfono produce 'lrwxrwxrwx' como los permisos. Tal vez es un problema de permisos? –

+1

¿Cómo puedo detectar mi cargador dinámico actual? ¿Puedo usar la utilidad readelf para aprender esto? – albin

Respuesta

16

Este problema se relaciona con el cargador dinámico. Cuando revisé el resultado del archivo binario con readelf, notifiqué que el compilador cruzado que uso tiene un tipo diferente de cargador dinámico predeterminado - "/lib/ld-linux.so.3", pero Android usa "/ system/bin/enlazador"

$ 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 

el fin de cambiar cargador dinámico (enlazador dinámico), "--dynamic-enlazador =/ruta/a/cargador" se debe utilizar para el enlazador.

$ brazo-ninguno-linux-gnueabi-gcc -o test.c prueba -Wall -Wl, - dinámico-enlazador =/sistema/bin/enlazador

+2

Esto es muy útil para compilar archivos binarios para el sistema de archivos de recuperación en Android, donde no/system/bin/linker está disponible y la ruta debe redefinirse. Gracias. –

Cuestiones relacionadas