[LUG.ro] Ejecutables x86 no portables a i386
Horacio Castellini
horacio9573 en yahoo.com.ar
Mie Ago 29 09:56:13 ART 2012
Recientemente he compilado un ejecutable en una máquina de SO Ubuntu
12.04 en un AMD 64 bits (x86). Ese mismo ejecutable lo copio en una
máquina con debian la cual es un viejo pero gaucho P4 (i386). Pero al
intentar ejecutarlo me dio el error:
./ruido-det: no se puede ejecutar el fichero binario
al no entender que pasaba, investigo los permisos y estaban bien, pero
al hacer:
ldd ruido-det
not a dynamic executable
Al ver la versión original en el x86 se ve esto:
ldd ruido-det
linux-vdso.so.1 => (0x00007fff8e1ff000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe5bca59000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe5bc69c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe5bcd72000)
ahí me di cuenta que algo no encajaba cuando recompilé el código en la i386
ldd ruido-det
linux-gate.so.1 => (0xb789d000)
libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xb7861000)
libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb7704000)
/lib/ld-linux.so.2 (0xb789e000)
en la x86 aparece una nueva biblioteca que da la incompatibilidad la
"linux-vdso.so.1" y "ld-linux-x86-64.so.2". Buscando en Learn Linux,
encuentro lo siguiente:
linux-vdso.so.1: is the Linux Virtual Dynamic Shared Object
/lib64/ld-linux-x86-64.so.2: is the absolute path to another library.
Leyendo mas, dice algo parecido a esto:
En los primeros días de procesadores x86, la comunicación de los
programas de usuario a los servicios de supervisor se realizó a través
de una interrupción de software. Como la velocidad del procesador
aumenta, esto se convirtió en un serio cuello de botella. Intel
introdujo un sistema de llamada rápida para acelerar las llamadas al
sistema utilizando el SYSENTER e instrucciones SYSEXIT en lugar de las
interrupciones.
La biblioteca linux-vdso.so.1 es una biblioteca virtual o Virtual
Dynamic Shared Object, que se encuentra sólo en el espacio de
direcciones de cada programa. En los sistemas antiguos se usaba
linux-gate.so.1. Esta biblioteca virtual proporciona la lógica necesaria
para permitir que los programas de usuario accedan a las funciones del
sistema de una manera más rápida según el procesador en particular.
Es decir: en según he leído los ejecutables i386 pueden correr en x86
pero la recíproca no es posible!!
Más información sobre la lista de distribución Lugro