Resolver problema de aapt del SDK Android en Gentoo Linux (puede que en otros también)

Si eres usuario de Gentoo Linux (y puede que de alguna otra distribución de Linux más) y utilizas el SDK de Android, seguramente estés recibiendo el siguiente error cuando tratas de utilizar la utilidad aapt desde la consola o bien a través de Eclipse:

android-sdk-linux_x86/platform-tools/aapt: /lib32/libz.so.1: no version
information available (required by android-sdk-linux_x86/platform-tools/aapt)

El problema es que el archivo binario /lib32/libz.so.1.2.5 que viene en el paquete emul-linux-x86-baselibs que es el que nos provee de las Zlibs para 32 bits al menos en Gentoo (en otras distribuciones el nombre del paquete será diferente) no presenta el campo .gnu_version_d en las cabeceras ELF que es necesario para el enlazador dinámico.

dd ./aapt 
./aapt: /lib32/libz.so.1: no version information available (required by ./aapt)
        linux-gate.so.1 =>  (0xffffe000)
        librt.so.1 => /lib32/librt.so.1 (0xf76c2000)
        libpthread.so.0 => /lib32/libpthread.so.0 (0xf76a9000)
        libz.so.1 => /lib32/libz.so.1 (0xf7696000)
        libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.5/32/libstdc++.so.6 (0xf759e000)
        libm.so.6 => /lib32/libm.so.6 (0xf7578000)
        libgcc_s.so.1 => /lib32/libgcc_s.so.1 (0xf755c000)
        libc.so.6 => /lib32/libc.so.6 (0xf7401000)
        /lib/ld-linux.so.2 (0xf7708000)
Como podemos ver al ejecutar ldd para conocer las librerías compartidas de la que depende el ejecutable aapt nos devuelve que no se dispone de información de versión para la librería /lib32/libz.so.1.

La solución es muy sencilla. Tan solo tenemos que descargar la versión 1.2.5 de Zlib, descomprimirlo y compilarlo para 32 bits. Ojo, si tienes este problema es por que estás usando una distribución de 64 bits y por lo tanto tu compilador compila por defecto para 64 bits. Para que ese no sea el comportamiento por defecto debemos aplicar el siguiente parche al archivo configure de zlibs:

Compilamos la librería y copiamos el resultado al directorio /lib32/:

sudo cp libz.* /lib32/
Si ahora ejecutamos un ldd sobre aapt veremos como todo está ya en orden:
$ ldd ./aapt
        linux-gate.so.1 =>  (0xffffe000)
        librt.so.1 => /lib32/librt.so.1 (0xf76f3000)
        libpthread.so.0 => /lib32/libpthread.so.0 (0xf76da000)
        libz.so.1 => /lib32/libz.so.1 (0xf76c3000)
        libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.5/32/libstdc++.so.6 (0xf75cb000)
        libm.so.6 => /lib32/libm.so.6 (0xf75a5000)
        libgcc_s.so.1 => /lib32/libgcc_s.so.1 (0xf7589000)
        libc.so.6 => /lib32/libc.so.6 (0xf742e000)
        /lib/ld-linux.so.2 (0xf7739000)

Aún no entiendo como se han podido dejar un bug tan tonto en una de las librerías más importantes de nuestras distribuciones pero como ya sabéis shit happens. Hasta otra.

Más en Genbeta Dev | Programando módulos para el Kernel de Linux, Guía rápida de desarrollo de paquetes para Gentoo Linux

Portada de Genbeta