Bug na compilação do Asterisk no Slackware 13.1+
Sunday, November 14th, 2010A alguns dias atrás me debati com um problema na compilação do asterisk nas versões 13.1+ do Slackware Linux. Esse problema era causado por um negligência dos desenvolvedores ao linkar os módulos que fazem uso da libcap que causava o seguinte erro ao carrega-los:
[Nov 14 14:05:16] WARNING[3840]: loader.c:433 load_dynamic_module: Error loading module 'res_agi.so': /usr/lib/asterisk/modules/res_agi.so: undefined symbol: cap_set_proc
Apesar da compilação ser feita com sucesso por conta do link ser feito no binário “asterisk” os módulos não são carregados com sucesso. Com o slackware manteve a biblioteca estática no sistema em /usr/lib/libcap.a e este diretório é procurado antes que o /lib pelo GCC na hora de linkar o problema acaba por ocorrer. O certo seria que na compilação dos módulos que fazem uso da libcap estes fossem linkado com o parâmetro -lcap.
A correção mais rápida, fácil e inelegante desse problema é mover a libcap.a para um diretório temporário fora do caminho do linker, compilar o asterisk e devolver ao seu diretório. Para conferir se o seu binário do asterisk foi linkado corretamente com a biblioteca dinâmica da libcap basta usar o comando ldd /usr/sbin/asterisk, o retorno deverá ser semelhante a:
linux-gate.so.1 => (0xffffe000)
libdl.so.2 => /lib/libdl.so.2 (0xb76f2000)
libcap.so.2 => /lib/libcap.so.2 (0xb76ed000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb76d4000)
libtermcap.so.2 => /lib/libtermcap.so.2 (0xb76d0000)
libm.so.6 => /lib/libm.so.6 (0xb76a9000)
libresolv.so.2 => /lib/libresolv.so.2 (0xb7692000)
libc.so.6 => /lib/libc.so.6 (0xb752f000)
/lib/ld-linux.so.2 (0xb7724000)
libattr.so.1 => /lib/libattr.so.1 (0xb752a000)
Caso não tenha dado certo o resultado será semelhante a:
linux-gate.so.1 => (0xffffe000)
libdl.so.2 => /lib/libdl.so.2 (0xb7797000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb777e000)
libtermcap.so.2 => /lib/libtermcap.so.2 (0xb777a000)
libm.so.6 => /lib/libm.so.6 (0xb7754000)
libresolv.so.2 => /lib/libresolv.so.2 (0xb773c000)
libc.so.6 => /lib/libc.so.6 (0xb75d9000)
/lib/ld-linux.so.2 (0xb77b0000)
