Por diversas razones de prueba, necesito ejecutar mis propios ejecutables ARM ELF de 32 bits en varios dispositivos Android ARM reales (no puedo usar emuladores). Debido a que no es fácil comprar un dispositivo ARMv7 en la actualidad, me gustaría ejecutar los ejecutables en dispositivos Android de 64 bits. Sin embargo, todos los dispositivos de 64 bits de varios proveedores a los que tengo acceso se niegan a ejecutar los ejecutables con este mensaje:
no ejecutable: archivo ELF de 32 bits
Esto significa que el sistema no puede ejecutar archivos ELF de 32 bits, o puede ejecutarlos pero está configurado para rechazarlos. ¿Hay algún truco para hacer que el sistema operativo de 64 bits ejecute ejecutables de 32 bits, al igual que Windows de 64 bits o Linux de 64 bits pueden ejecutar ejecutables de 32 bits?
Utilizo los siguientes pasos para enviar y ejecutar el archivo:
adb push printf /data/local/tmp/
adb shell chmod 555 /data/local/tmp/printf
adb shell /data/local/tmp/printf
Esto retorna:
/system/bin/sh: /data/local/tmp/printf: no ejecutable: archivo ELF de 32 bits
1 votos
El mensaje de error es engañoso, es otra razón. descargar busybox e intentar
busybox printf
0 votos
@alecxs ¿Puedes ser más específico por favor? Cuando renombro mi ejecutable
printf
aprintfx
y ejecuto./busybox-armv8l printfx
desde/data/local/tmp/
, dice "printfx: applet not found" porque espera que el parámetro sea una de las funciones compatibles con busybox.0 votos
Principalmente los dispositivos ARM64 (procesadores) admiten ejecución de 32 bits. Pero lo contrario tampoco es imposible. Mayormente los núcleos de Linux/Android de 64 bits están construidos para admitir el modo de compatibilidad de 32 bits, pero lo contrario tampoco es imposible. Detalles aquí: ¿Podría un dispositivo de hardware de 64 bits ejecutar una versión de Android de 32 bits?. Pero intenta con algunos binarios preconstruidos para asegurarte de que el problema no radica en tu enlace estático (o dinámico), ambiente, permisos, etc. ¿Qué devuelve
ls -lZ /data/local/tmp/printf; file /data/local/tmp/printf
? ¿Root? SELinux?0 votos
@alecxs ¿Por qué crees que mi ejecutable está roto? Funciona perfectamente en un dispositivo armv7. Quizás no comprendas mi pregunta, no me interesa la funcionalidad de printf. Nombré mi ejecutable "printf" solo porque imprime algo en stdout.
0 votos
@IrfanLatif En Nokia 8, sin acceso root, devuelve "-r-xr-xr-x 1 shell shell u:object_r:shell_data_file:s0 138 2020-04-30 22:50 /data/local/tmp/printf" para el primer comando y "/data/local/tmp/printf: ELF ejecutable, LSB de 32 bits arm, estático, recortado" para el segundo.
0 votos
No lo sé, ¿funciona busybox de 32 bits? entonces necesitas recompilar tu binario con las banderas correctas (quizás -fPIE y -pie)? o algún otro conjunto de instrucciones también para vincular dinámicamente el nivel de API de Android importa (que, hasta donde sé, no se puede configurar en otras herramientas que no sean NDK)
1 votos
@MazeGen Los procesadores ARMv8 son compatibles únicamente con ARMv7. Tu binario debe ser ARM v5/v6. Reconstrúyelo para al menos
armeabi-v7a
. Ver detalles aquí: android.stackexchange.com/a/208132/2185260 votos
@IrfanLatif Wow, tienes razón, no entiendo cómo pude pasarlo por alto. ¿Puedes volver a publicar tu respuesta como una respuesta?