1

全部:

我正在 Solaris 10 环境中测试 unixODBC,并查找 libodbc 和 MyODBC 驱动程序是否与 libltdl.so 动态链接:

    ldd /usr/lib/libodbc.so.2
    libltdl.so.7 =>  /usr/local/lib/libltdl.so.7
    libiconv.so.2 =>         /usr/local/lib/libiconv.so.2
    libthread.so.1 =>        /usr/lib/libthread.so.1
    libc.so.1 =>     /usr/lib/libc.so.1
    libgcc_s.so.1 =>         /usr/lib/libgcc_s.so.1
    libm.so.2 =>     /usr/lib/libm.so.2
    /platform/SUNW,Sun-Fire-V240/lib/libc_psr.so.1

    ldd /data/nan/mysql-connector-odbc-5.2.4-src/lib/libmyodbc5a.so
    libodbc.so.2 =>  /usr/lib/libodbc.so.2
    libthread.so.1 =>        /usr/lib/libthread.so.1
    libm.so.2 =>     /usr/lib/libm.so.2
    libodbcinst.so.2 =>      /usr/lib/libodbcinst.so.2
    libgcc_s.so.1 =>         /usr/lib/libgcc_s.so.1
    libltdl.so.7 =>  /usr/local/lib/libltdl.so.7
    libiconv.so.2 =>         /usr/local/lib/libiconv.so.2
    libc.so.1 =>     /usr/lib/libc.so.1
    /platform/SUNW,Sun-Fire-V240/lib/libc_psr.so.1

有时它会在启动应用程序时连接 MySQL 服务器失败。日志是这样的:

[ODBC][6738][1361325895.588941][SQLConnect.c][1111]Can't open lib '/data/nan/mysql-connector-odbc-5.2.4-src/lib/libmyodbc5a.so' : file not found
[ODBC][6738][1361325895.588979][SQLConnect.c][1111]Can't open lib '/data/nan/mysql-connector-odbc-5.2.4-src/lib/libmyodbc5a.so' : file not found

一段时间后,应用程序运行正常。

    But if libodbc and MyODBC driver aren't dynamically linked with libltdl.so:
    ldd /usr/local/lib/libodbc.so.2
    libiconv.so.2 =>         /usr/local/lib/libiconv.so.2
    libthread.so.1 =>        /usr/lib/libthread.so.1
    libc.so.1 =>     /usr/lib/libc.so.1
    libgcc_s.so.1 =>         /usr/local/lib/libgcc_s.so.1
    libm.so.2 =>     /usr/lib/libm.so.2
    /platform/SUNW,UltraAX-i2/lib/libc_psr.so.1

    ldd /data1/susie/mysql/tools/test_static_modify/mysql-connector-odbc-5.2.3-src/lib/libmyodbc5a.so
    libodbc.so.2 =>  /usr/local/lib/libodbc.so.2
    libthread.so.1 =>        /usr/lib/libthread.so.1
    libm.so.2 =>     /usr/lib/libm.so.2
    libodbcinst.so.2 =>      /usr/local/lib/libodbcinst.so.2
    libgcc_s.so.1 =>         /usr/local/lib/libgcc_s.so.1
    libiconv.so.2 =>         /usr/local/lib/libiconv.so.2
    libc.so.1 =>     /usr/lib/libc.so.1
    /platform/SUNW,UltraAX-i2/lib/libc_psr.so.1

应用程序运行正常..

所以我认为这可能是 unixODBC 中的一个潜在问题。谁能帮忙检查一下?首先十分感谢!

最好的问候
南肖

4

1 回答 1

0

unixODBC 所做的只是从 libltdl 调用 dlopen 和 dlsym,我想知道 lib 中是否存在一些导致问题的静态因素。如果您不构建 unixODBC 来使用外部 libltdl,它会使用自己的版本(来自 libtool),所以同样,这可能与它们都使用同一个库发生冲突。你说你正在使用 Solaris。你链接的 libltdl 是来自 Sun 吗?

有趣的是,如果您可以让它在 truss 下失败,那么我们可以看到“找不到文件”是由什么引起的。

我还想知道 MySQL 驱动程序使用 libltdl 的目的是什么?

于 2013-04-02T11:12:29.347 回答