私はDebian 9.8(Stretch)を実行するARM Tinkerboardを持っています。システムバージョンは232です。私はユーザースペースやデーモンとして実行できるプログラムを開発しています。デーモンとして実行していて、Systemdを見つけるために使用されているdlopen
場合dlsym
sd_notify(3)
エントリポイント。
~によるとsd_notify(3)
マニュアルページ:
これらの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
$
共有ライブラリはどこにありますか?
答え1
libsystemd.so
これはパッケージが提供するシンボリックリンクであり、libsystemd-dev
ライブラリを使用するプログラムを構築する場合にのみ便利です。そのターゲットは、ライブラリを使用するプログラムを実行するために必要なものを提供するlibsystemd.so.0
パッケージによって提供されます。 PCにはありますが、Armデバイスには見つからない場合は、PCには開発環境がインストールされていますが、Armデバイスにはないためですlibsystemd0
。libsystemd.so
ほとんどの図書館はそうです。プログラムが使用するライブラリファイルにはバージョン番号が含まれています。これにより、システムは互換性のない複数のバージョンのライブラリを持つことができます。各バージョンは番号で識別され、独自のファイルです。 Debian パッケージ名にはライブラリのバージョン番号も含まれます。ライブラリ用の開発ファイル(ヘッダーと静的ライブラリ)がある場合は、ビルドするプログラムが使用するライブラリのバージョンへのシンボリックリンクがあります。libfoo.so.VERSION
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 …