[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