私は組み込みプラットフォームを開発しており、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に問題がある可能性があります)。だから、まだ根本的な原因を理解していません。しかし、症状は解決されました。