miércoles, 29 de agosto de 2012

ejecutables x86 no portables a i386

Recientemente he compilado un ejecutable en una máquina de SO Ubuntu 12.04 de 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!!