
저는 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
대부분의 도서관이 그렇습니다. 프로그램에서 사용하는 라이브러리 파일에는 버전 번호가 포함되어 있습니다. 이를 통해 시스템은 호환되지 않는 여러 버전의 라이브러리를 가질 수 있습니다. 각 버전은 번호로 식별되며 자체 파일입니다. 데비안 패키지 이름에는 라이브러리 버전 번호도 포함됩니다. 라이브러리용 개발 파일(헤더 및 정적 라이브러리)이 있는 경우 빌드하는 프로그램이 사용할 라이브러리 버전에 대한 심볼릭 링크가 있습니다.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 …