SafeChildren Banner

Havoc Oracle Solaris Experts

lunes, 7 de diciembre de 2009

Problemas Compilación GCC Solaris 64bits Apache Mod_JK

Introducción
Compilar Apache 1.3.41 en 64bits en Solaris con GCC puede darnos algún que otro problema cuando empecemos a incluir módulos como mod_jk, mod_gzip, principalmente debido a un problema de configuración predeterminada en la compilación del binario de gcc que viene con Solaris. Este problema es que tiene asignado como Runtime Library Search Path (-rpath) /usr/sfw/lib y por lo tanto, cuando utilizamos el modificador -m64 para crear binarios de 64bits

En los post sobre Compilación de Apache 1.3.41 en 64bits hemos solucionado el problema asignando el valor de la variable LD_LIBRARY_PATH_64 a </usr/sfw/lib/64>, aunque no está mal, existe otra solución para evitar tener que estar asignando la variable en cada ejecución. Durante la compilación de Apache, podemos asignar Runtime Library Search a </usr/sfw/lib/64> a LDFLAGS, de esta forma el linker incluirá en sus search path la ruta de 64 en vez de la de 32, veamos un ejemplo:

Compilaremos Apache con los siguientes parámetros, fijaros que en esta ocasión hemos incluido LDFLAGS además de CFLAGS
CFLAGS="-m64 -O2" \
LDFLAGS="-R/usr/sfw/lib/64" \
./configure \
"--with-layout=Apache" \
"--enable-module=rewrite" \
"--enable-module=expires" \
"--enable-module=headers" \
"--enable-module=mmap_static" \
"--add-module=src/modules/extra/mod_bandwidth.c" \
"--permute-module=BEGIN:bandwidth" \
"--activate-module=src/modules/extra/mod_security" \
"--enable-module=security" \
"--enable-module=status" \
"--enable-module=so" \
"--prefix=/opt/www/apache-1.3.41/64" \
"$@"
Compilaremos como siempre nuestro Apache 1.3.41 y lo instalaremos. Ahora vamos a comprobar cómo sin establecer la variable LD_LIBRARY_PATH_64 el binario <httpd> encuentra correctamente las bibliotecas de 64bits de <sfw>
$ echo $LD_LIBRARY_PATH

$ echo $LD_LIBRARY_PATH_64

$ ldd httpd 
        libsocket.so.1 =>        /usr/lib/64/libsocket.so.1
        libnsl.so.1 =>   /usr/lib/64/libnsl.so.1
        libpthread.so.1 =>       /usr/lib/64/libpthread.so.1
        libexpat.so.1 =>         /usr/sfw/lib/64/libexpat.so.1
        libc.so.1 =>     /usr/lib/64/libc.so.1
        libmp.so.2 =>    /lib/64/libmp.so.2
        libmd.so.1 =>    /lib/64/libmd.so.1
        libscf.so.1 =>   /lib/64/libscf.so.1
        libdoor.so.1 =>  /lib/64/libdoor.so.1
        libuutil.so.1 =>         /lib/64/libuutil.so.1
        libgen.so.1 =>   /lib/64/libgen.so.1
        libm.so.2 =>     /lib/64/libm.so.2
Ahora bien, continuando con la compilación de los módulos, nos encontramos con el problema añadido de MOD_JK. La compilación de mod_jk utilizando APXS, se realiza de la siguiente forma, recordar que mod_jk se compila con GNU Make <gmake>
$ CFLAGS="-m64 -O2" ./configure --with-apxs=/opt/www/apache-1.3.41/64/bin/apxs
$ gmake
Durante el proceso de link, se produce el siguiente error
ld: error fatal: archivo .libs/mod_jk.o: clase ELF incorrecta: ELFCLASS64
ld: error fatal: Errores en el proceso de archivos. No se escribir? la salida en .libs/mod_jk.so.0.0.0
collect2: ld returned 1 exit status
Esto es debido a que no hemos incluido el flag -64 para que el linker cree una <so> de 64bits, así que vamos a incluir los siguientes flags,
$ CFLAGS="-m64 -O2" LDFLAGS="-64 -R/usr/sfw/lib/64" ./configure --with-apxs=/opt/www/apache-1.3.41/64/bin/apxs
$ gmake
Ahora durante el proceso de link, se produce ahora un nuevo error,
ld: error fatal: archivo /usr/lib/crti.o: clase ELF incorrecta: ELFCLASS32
ld: error fatal: Errores en el proceso de archivos. No se escribir? la salida en .libs/mod_jk.so.0.0.0
collect2: ld returned 1 exit status
gmake[1]: *** [mod_jk.la] Error 1
Esto se debe a que el configurador no asigna correctamente el flag -m64 a la variable MOD_LINK del archivo Makefile, para ello, editaremos el archivo que se encuentra en $MOD_JK_HOME/native/apache-1.3 y sustituiremos el valor de MOD_LINK
MOD_LINK   = $(LIBTOOL) --mode=link $(CC)  -Wl,-G -Wl,-64 -Wl,-R/usr/sfw/lib/64
por el siguiente valor
MOD_LINK   = $(LIBTOOL) --mode=link $(CC)  -Wl,-G -Wl,-64 -Wl,-R/usr/sfw/lib/64 -m64
Una vez hecho esto, volvemos a compilar el mod_jk, y comprobaremos que todo está correcto.

$ gmake clean all

$ cd apache-1.3/.libs/
$ file mod_jk.so
mod_jk.so:      ELF 64 bits LSB biblioteca dinámica AMD64 Versión 1, enlazado dinámicamente, no quitado, no hay información de depuración disponible
$ ldd mod_jk.so
        libc.so.1 =>     /lib/64/libc.so.1
        libgcc_s.so.1 =>         /usr/sfw/lib/64/libgcc_s.so.1
        libm.so.2 =>     /lib/64/libm.so.2
Ya sólo nos quedaría instalar el módulo con <gmake install> y listo


Conclusiones

En esta ocasión hemos visto solventar pequeños problemas de compilación con GCC en Solaris 10 x64 y cómo con algunos cambios en la configuración podemos hacer que nuestro Apache 1.3.41 y Mod_JK compilen.

Recordar que hemos realizado la compilación y las pruebas en Solaris 10 x86_64, y que para SPARC 64bits el directorio </usr/sfw/lib/64> es un link </usr/sfw/lib/sparcv9> y por lo tanto, las opciones del linker funcionarán también en SPARC, sin embargo, si utilizamos Sun CC como compilador, no será necesario realizar estos pasos, ya que no existe ese Bug.

Referencias

No hay comentarios:

Publicar un comentario