Harto tiempo ha pasado desde la ultima version estable de mod_bw.
Y por mas estable que sea, no esta libre de problemas…
Frederik Temmermans me contacto hace algunas semanas, y me envio algunos errores que le aparecen al compilar la version actual de mod_bw (0.8 ahora).
Estaba corriendo MacOSX 10.5.7 con Apache 2.2.11.
Al compilar con apxs, el modulo se construye y se instala. Pero luego de iniciar Apache, el siguiente error aparece :
httpd.conf: Cannot load /usr/libexec/apache2/mod_bw.so into server:2.dlopen(/usr/libexec/apache2/mod_bw.so, 10): no suitable image found. Did find:/usr/libexec/apache2/mod_bw.so: mach-o, but wrong architecture
De acuerdo a esto.. tenemos el binario, solo que para la arquitectura equivocada.
Dado que los Mac de hoy tienen cpu Intel, parece ser un problema de 32/64 bits.
OsX funciona como un sistema hibrido, corriendo aplicaciones en 32 y 64 bits (desde algun tiempo). Al parecer Apache fue compilado para 64bits :
# httpd -V
Server version: Apache/2.2.11 (Unix)
Server built: Feb 3 2009 01:54:45
Server's Module Magic Number: 20051115:21
Server loaded: APR 1.2.7, APR-Util 1.2.7
Compiled using: APR 1.2.7, APR-Util 1.2.7
Architecture: 64-bit
Server MPM: Prefork
threaded: no
forked: yes(variable process count)
# uname -a
Darwin G1X.local
Darwin Kernel Version 9.7.0: Tue Mar 31 22:52:17 PDT14.2009; root:xnu-1228.12.14~1/RELEASE_I386 i386
Y pareciera que apxs insiste en compilar un binario para 32 bits.
(Este era mi Asus G1 corriendo OsX. Lo siento Apple, tengo claro que no permiten hacer esto, pero desafortunadamente no puedo adquirir sus equipos).
Despues de descubrir eso, fue solo un tema de ajustar algunas opciones.
Corriendo apxs asi :
apxs -c -i -Wc,'-arch x86_64' -Wl,'-arch x86_64' mod_bw.c
Se obtendra un modulo para 64bits.
……………………
Acaso dije que eso era ?
La vida no le gusta dejarnos las cosa faciles. Luego de corregir esto, Frederik dio con otro problema. (Y esto es raro. Mi sistema lo configure identico al suyo, y no me aparecio).
Si al cargar el modulo obtienes un error como este :
httpd: Syntax error on line 117 of /private/etc/apache2/httpd.conf:
Cannot load /usr/libexec/apache2/mod_bw.so into server:
dlopen(/usr/libexec/apache2/mod_bw.so, 10): Symbol not found: _apr_atomic_add\n Referenced from: /usr/libexec/apache2/mod_bw.so
Expected in: dynamic lookup
Es por que algunas instrucciones usadas en el modulo no estan disponibles en la version de la libreria APR en tu sistema. Lo he visto ocurrir en algunas distribuciones pero nunca me ha ocurrido. Afortunadamente, cuando me notificaron de este error fue sencillo corregir el codigo para evitar el problema.
Se deben encontrar las siguientes lineas en el codigo, y eliminarlas.
#if (APR_MAJOR_VERSION < 1)
#define apr_atomic_inc32 apr_atomic_inc
#define apr_atomic_dec32 apr_atomic_dec
#define apr_atomic_add32 apr_atomic_add
#define apr_atomic_cas32 apr_atomic_cas
#define apr_atomic_set32 apr_atomic_set
#endif
Compila nuevamente y estamos listos ! (ahora si que si)
Para las nuevas versiones este arreglo ya vendra incluido y no deberian haber mas problemas. (toco madera)