我有一个运行 Debian 9.8 (Stretch) 的 ARM Tinkerboard。 Systemd 版本是 232。我正在开发一个可以从用户态运行或作为守护进程运行的程序。如果它作为守护进程运行,则dlopen
和dlsym
用于定位 Systemdsd_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.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 …