【问题标题】:Loading mod_ilbc in FreeSwitch failed在 FreeSwitch 中加载 mod_ilbc 失败
【发布时间】:2018-04-06 03:40:13
【问题描述】:

我之前已经成功安装过其他 FS 模块,但是这个我无法修复。我会提供尽可能多的细节,这个问题可能不是 FreeSwitch 特定的问题。任何一般性的故障排除建议将不胜感激。

环境如下,我用的是freeswitch-1.6.19源码。

$ cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core)

$ ls /usr/lib64/ilbc2/ -lh
total 64K
lrwxrwxrwx. 1 root root  16 Oct 24 20:18 libilbc.so -> libilbc.so.0.0.2
lrwxrwxrwx. 1 root root  16 Sep 18 18:03 libilbc.so.0 -> libilbc.so.0.0.2
-rwxr-xr-x. 1 root root 64K Jun 23  2015 libilbc.so.0.0.2

$ nm -D /usr/lib64/ilbc2/libilbc.so
--- omitted many lines ----
0000000000007590 T ilbc_decode
0000000000007790 T ilbc_decode_init
0000000000007c30 T ilbc_encode
0000000000008f80 T ilbc_encode_init
--- omitted many lines ----

我采取了这些步骤来编译mod_ilbc

  1. modules.conf 中取消注释codecs/mod_ilbc
  2. ./configure --prefix=/opt/freeswitch/
  3. make
  4. make install
  5. 修改/opt/freeswitch/etc/freeswitch/vars.xml,将iLBC@30i添加到global_codec_prefs
  6. 开始freeswitch。

以下是我认为事情进展顺利的证据:

  1. make install 成功安装 mod_ilbc。 make 进程成功检测到libilbc 并使用libtool 链接。 make install 的输出,注意 -L/usr/lib64/ilbc2 -lilbc 部分。
安装 mod_ilbc make[4]: 进入目录`/home/cenzhe.zhu/freeswitch-1.6.19/src/mod/codecs/mod_ilbc' make[5]: 进入目录`/home/cenzhe.zhu/freeswitch-1.6.19/src/mod/codecs/mod_ilbc' make[5]: `install-exec-am' 什么都不做。 测试 -z "/opt/freeswitch/lib/freeswitch/mod" || /usr/bin/mkdir -p "/opt/freeswitch/lib/freeswitch/mod" /bin/sh /home/cenzhe.zhu/freeswitch-1.6.19/libtool --mode=install /usr/bin/install -c mod_ilbc.la '/opt/freeswitch/lib/freeswitch/mod' libtool: 安装: (cd /home/cenzhe.zhu/freeswitch-1.6.19/src/mod/codecs/mod_ilbc; /bin/sh /home/cenzhe.zhu/freeswitch-1.6.19/libtool --silent --标签 CC --mode=relink gcc -I/usr/include/uuid -I/home/cenzhe.zhu/freeswitch-1.6.19/src/include -I/home/cenzhe.zhu/freeswitch-1.6.19/src /include -I/home/cenzhe.zhu/freeswitch-1.6.19/libs/libteletone/src -fPIC -Werror -Wno-unused-result -fvisibility=hidden -DSWITCH_API_VISIBILITY=1 -DHAVE_VISIBILITY=1 -g -ggdb -DHAVE_OPENSSL -Wall -std=c99 -pedantic -Wdeclaration-after-statement -I/usr/include/ilbc2 -g -O2 -avoid-version -module -no-undefined -shared -o mod_ilbc.la -rpath /opt/freeswitch/ lib/freeswitch/mod mod_ilbc_la-mod_ilbc.lo /home/cenzhe.zhu/freeswitch-1.6.19/libfreeswitch.la -L/usr/lib64/ilbc2 -lilbc -lssl -lcrypto ) libtool:安装:/usr/bin/install -c .libs/mod_ilbc.soT /opt/freeswitch/lib/freeswitch/mod/mod_ilbc.so libtool:安装:/usr/bin/install -c .libs/mod_ilbc.lai /opt/freeswitch/lib/freeswitch/mod/mod_ilbc.la libtool:完成:PATH="/sbin:/bin:/usr/sbin:/usr/bin:/sbin" ldconfig -n /opt/freeswitch/lib/freeswitch/mod -------------------------------------------------- -------------------- 库已安装在: /opt/freeswitch/lib/freeswitch/mod
  1. mod_ilbc 编译正确。它需要来自libilbc 的符号,如ilbc_decode。分析mod_ilbc.so
$ nm -D /opt/freeswitch/lib/freeswitch/mod/mod_ilbc.so ---省略了很多行---- 0000000000001060 T_fini w __gmon_start__ U ilbc_decode U ilbc_decode_init U ilbc_encode U ilbc_encode_init ---省略了很多行----
  1. 在启动 freeswitch 时,它尝试使用 dlfcn 加载模块但失败。 freeswitch.log的输出:
2017-10-25 13:54:24.243208 [CRIT] switch_loadable_module.c:1528 加载模块/opt/freeswitch/lib/freeswitch/mod/mod_ilbc.so 时出错 **/opt/freeswitch/lib/freeswitch/mod/mod_ilbc.so:未定义符号:ilbc_decode**

在我看来这是因为 freeswitch 无法链接/usr/lib64/ilbc2/libilbc.so,但为什么呢?如何进一步排查问题?

【问题讨论】:

    标签: linker codec freeswitch libtool


    【解决方案1】:

    似乎将问题表述出来并写下来确实有助于解决问题。现在问题解决了。

    一开始,我不知道我需要哪个libilbc,所以我都安装了sudo yum install ilbc-devel ilbc2-devel。后来当事情不起作用时,我遇到了这个issue,所以我删除了sudo yum remove ilbc-devel 的版本1。但这并没有删除库文件!

    /usr/lib64/libilbc.so.0.0.1/usr/lib64/libilbc.so.0 仍然存在,freeswitch 从他们那里寻找libilbc。砰!

    【讨论】:

    • 我发现对调试此类库链接问题有用的一个命令是lddldd /opt/freeswitch/lib/freeswitch/mod/mod_ilbc.so 将显示加载模块所需的共享库列表。
    • @PhilippeSultan 这很有趣。 ldd 实际上是通过链接过程,所以我可以看到 FS 正在尝试链接到过时的 so 文件。下次会派上用场。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多