私はDebian9.8(Stretch)を実行しているARM Tinkerboardを持っています。Systemdバージョンは232です。ユーザーランドから、またはデーモンとして実行できるプログラムに取り組んでいます。デーモンの場合、dlopen
とdlsym
を使用してSystemdを検索します sd_notify(3)
エントリポイント。
sd_notify(3)
manページ によると:
これらのAPIは共有ライブラリとして実装されており、コンパイルしてlibsystemd pkg-config(1)ファイルにリンクすることができます。
残念ながら、libsystemd.so
が見つかりません。これは、サービスの負荷をシミュレートするためのユーザーランドテストです。
$ LD_PRELOAD=/lib/libsystemd.so NOTIFY_SOCKET=-1 ./myprog.exe
ERROR: ld.so: object '/lib/libsystemd.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
標準の場所に配置されていないようです。
$ find /lib -name libsystemd.so
$ find /usr -name libsystemd.so
$
実際には:
$ Sudo find / -name libsystemd.so
$
共有ライブラリはどこにありますか?
libsystemd.so
は、libsystemd-dev
パッケージによって提供されるシンボリックリンクであり、ライブラリを使用するプログラムをビルドする場合にのみ役立ちます。そのターゲットは、ライブラリを使用するプログラムを実行するために必要なものを提供するlibsystemd.so.0
パッケージによって提供されるlibsystemd0
です。 PCにlibsystemd.so
が見つかったが、Armデバイスには見つからなかった場合は、開発環境環境をPCにインストールしたが、Armデバイスにはインストールしていないことが原因です。
これはほとんどのライブラリに当てはまります。プログラムが使用するライブラリファイルには、バージョン番号libfoo.so.VERSION
が含まれています。これにより、システムはライブラリの互換性のないバージョンを複数持つことができます。各バージョンは番号で識別され、独自のファイルです。 Debianパッケージ名には、ライブラリのバージョン番号libfooVERSION
も含まれています。ライブラリの開発ファイル(ヘッダーと静的ライブラリlibfoo.a
)がある場合、それらには、ビルドするプログラムが使用するライブラリのバージョンを指すシンボリックリンクlibfoo.so
が付属しています。
したがって、find /lib /usr/lib -name libsystemd.so.0
を実行します。
または、ライブラリに対して動的にリンクされている実行可能ファイルに対してldd
を実行します(実行時にdlopen
を使用してロードするのではなく)。 ldd /usr/bin/dbus-daemon
。
または、インストールされているパッケージをdpkg -S libsystemd.so.0
で検索します。
または、apt-file search libsystemd.so.0
で利用可能なパッケージを検索します(apt-file
が設定されていると仮定します)。
または オンラインで検索 。
LD_PRELOAD=/lib/arm-linux-gnueabihf/libsystemd.so.0 …