0 votos

¿Por qué son diferentes los archivos ELF de Android?

Cuando intento ejecutar un archivo x64 ELF que fue construido para Android en mi PC de escritorio, recibo un error de "archivo no encontrado".

Creo que eso es normal porque los archivos ELF de Android no son compatibles con los archivos ELF normales.

¿Cuál es la razón detrás de esto?

0 votos

Las bibliotecas estándar en Android son un poco diferentes. ¿Has revisado las bibliotecas vinculadas del ejecutable a través de ldd?

2 votos

Construye un programa vinculado estáticamente y funcionará en ambos lados. Para binarios/bibliotecas vinculados dinámicamente se requiere un enlazador que vincule y cargue las bibliotecas necesarias por el programa ejecutado. La ruta del enlazador está codificada en duro en el programa. Es /system/bin/linker en caso de Android (cuando se construye con NDK), mientras que algo como /lib/ld.so en caso de distribuciones comunes de Linux (cuando se construye con GCC, etc.). Así que la ejecución no se iniciará en absoluto.

1voto

John Dallman Puntos 103

El formato de archivo ELF es el mismo. La diferencia son las rutas de archivo incrustadas en el archivo ELF.

ELF es un formato muy general, que puede codificar muchas cosas sobre el contenido de un archivo. Linux, Android y muchos otros sistemas operativos utilizan el formato ELF para ejecutables y bibliotecas, pero eso no los hace compatibles. Es como tener indicaciones para diferentes viajes por carretera. Todos están escritos en el mismo idioma (correspondiente a ELF) pero intentar seguir indicaciones para llegar a Koln desde Stuttgart cuando estás en Frankfurt no funcionará.

Según los comentarios, si construyes un ejecutable enlazado estáticamente completamente para x86-64, es posible que funcione tanto en el emulador de Android como en tu escritorio Linux. Sin embargo, la mayoría de los programas necesitan usar bibliotecas del sistema, y el enlazador incrusta los nombres de esas bibliotecas y la ruta al enlazador de tiempo de ejecución en tus ejecutables ELF.

Aunque Android utiliza un kernel de Linux, las bibliotecas del sistema y el enlazador de tiempo de ejecución son completamente diferentes de Linux. Android utiliza la biblioteca Bionic, y la mayoría de las distribuciones de Linux utilizan glibc. Esto fue intencional: Android fue diseñado originalmente para dispositivos bastante lentos sin mucha RAM, y necesitaba una biblioteca que no ocupara mucho espacio y se ejecutara rápidamente. Glibc podía asumir hardware más potente.

El enlazador de tiempo de ejecución de Android es /system/bin/linker (o /system/bin/linker64 para código de 64 bits). El enlazador de tiempo de ejecución de Linux es normalmente /lib/ld.so (o /lib64/ld-linux-x86-64.so.2 para código de 64 bits). Obviamente, estas son rutas diferentes, y cada una solo existe en el sistema operativo relevante. El error de "archivo no encontrado" que obtienes al ejecutar un archivo ELF de Android en Linux es una queja de que /system/bin/linker64 no existe en tu sistema Linux.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X