unixODBC: libmaodbc.so をロードできません。

unixODBC: libmaodbc.so をロードできません。

私は組み込みプラットフォームを開発しており、unixODBCを介してMariaDBにアクセスしようとしています。 isqlとの接続をテストしようとすると、次のような応答を受け取ります。

isql -v mydsn myuser mypw
[01000][unixODBC][Driver Manager]Can't open lib '/usr/lib/libmaodbc.so' : file not found

/usr/lib/libmaodbc.so ファイルが存在します。

ls -la /usr/lib/libmaodbc.so
-r-xr-xr-x    1 root     root        403952 Sep  1 00:00 /usr/lib/libmaodbc.so

だから私は依存性が欠けていること間違いないと思います。

readelf -d /usr/lib/libmaodbc.so 

Dynamic section at offset 0x4fb54 contains 30 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libodbcinst.so.2]
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x00000001 (NEEDED)                     Shared library: [ld-linux-armhf.so.3]
 0x0000000e (SONAME)                     Library soname: [libmaodbc.so]
[...]

確認を繰り返しました。 4つの依存関係がすべて存在します。

次に、共有オブジェクトをロードしようとするテストプログラムを作成しました。

#include <iostream>
#include <dlfcn.h>

void tryLoadSo(const std::string& path) {
    void* so = dlopen(path.c_str(), RTLD_NOW);
    if(so) {
        std::cout << "Loaded " << path << "!" << std::endl;
        dlclose(so);
    } else {
        std::cout << "Failed to load " << path << "!" << std::endl;
    }
}

int main() {
    tryLoadSo("/usr/lib/libmaodbc.so");
    tryLoadSo("/usr/lib/libodbcinst.so.2");
    tryLoadSo("/usr/lib/libm.so.6");
    tryLoadSo("/usr/lib/libc.so.6");
    tryLoadSo("/usr/lib/ld-linux-armhf.so.3");
}

出力:

Failed to load /usr/lib/libmaodbc.so!
Loaded /usr/lib/libodbcinst.so.2!
Loaded /usr/lib/libm.so.6!
Loaded /usr/lib/libc.so.6!
Loaded /usr/lib/ld-linux-armhf.so.3!

したがって、すべての依存関係をロードできますが、libmaodbcはロードできません。

共有オブジェクトが正しいプラットフォームで構成されていませんか?はい。確認するためにlibodbcinst.so.2と比較した。

readelf -h /usr/lib/libmaodbc.so 
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x9a58
  Start of program headers:          52 (bytes into file)
  Start of section headers:          402952 (bytes into file)
  Flags:                             0x5000400, Version5 EABI, hard-float ABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         7
  Size of section headers:           40 (bytes)
  Number of section headers:         25
  Section header string table index: 24

readelf -h /usr/lib/libodbcinst.so.2
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x1e60
  Start of program headers:          52 (bytes into file)
  Start of section headers:          53528 (bytes into file)
  Flags:                             0x5000400, Version5 EABI, hard-float ABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         6
  Size of section headers:           40 (bytes)
  Number of section headers:         24
  Section header string table index: 23

何が間違っている可能性がありますか? libmaodbc.soをロードできないのはなぜですか?

ベストアンサー1

libmaodbc.soとlibmariadb.so.3は静的にリンクされています。これでlibmariadb.so.3を動的にリンクすると機能します。

間違っているか、一致しないライブラリがリンクされているか、他の接続設定が間違っているかどうかはわかりません(CMakeLists.txtに問題がある可能性があります)。だから、まだ根本的な原因を理解していません。しかし、症状は解決されました。

おすすめ記事