libsystemd.so 位于 ARM 设备上的什么位置?

libsystemd.so 位于 ARM 设备上的什么位置?

我有一个运行 Debian 9.8 (Stretch) 的 ARM Tinkerboard。 Systemd 版本是 232。我正在开发一个可以从用户态运行或作为守护进程运行的程序。如果它作为守护进程运行,则dlopendlsym用于定位 Systemdsd_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由包提供的libsystemd0,它提供了运行使用该库的程序所需的内容。如果您libsystemd.so在PC上可以找到,但在Arm设备上找不到,这是因为您在PC上安装了开发环境,但在Arm设备上没有安装。

大多数图书馆都是这种情况。程序使用的库文件包含版本号:.这使得系统可以拥有多个不兼容的库版本:每个版本都由一个数字标识,并且是它自己的文件。 Debian 软件包名称还包括库版本号:.如果您有库的开发文件(标头和静态库),它们会带有一个符号链接,指向您构建的程序将使用的库版本。libfoo.so.VERSIONlibfooVERSIONlibfoo.alibfoo.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 …

相关内容