web-dev-qa-db-ja.com

libsystemd.soはARMデバイスのどこにありますか?

私はDebian9.8(Stretch)を実行しているARM Tinkerboardを持っています。Systemdバージョンは232です。ユーザーランドから、またはデーモンとして実行できるプログラムに取り組んでいます。デーモンの場合、dlopendlsymを使用して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
$

共有ライブラリはどこにありますか?

3
user56041

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 …