공유 라이브러리를 로드하는 중 오류 발생: 내부 오류

공유 라이브러리를 로드하는 중 오류 발생: 내부 오류

Arm Follow를 위해 OpenCV를 크로스 컴파일했습니다.이 가이드, 그리고 이것을 만들었습니다샘플 프로그램.

처음 실행했을 때는 다음과 같았습니다.

./DisplayImage image.png

내가 얻은 것 :

./DisplayImage: 공유 라이브러리를 로드하는 중 오류가 발생했습니다.
libopencv_highgui.so.3.1: 공유 개체 파일을 열 수 없습니다. 해당 파일이나 디렉터리가 없습니다.

그래서 나는 도서관이 필요하다고 생각했습니다 libopencv_highgui.so.3.1. 그래서 이 모든 libs를 다음에 추가했습니다 /lib.

(1) libopencv_highgui.so
(2) libopencv_highgui.so.3.1
(3) libopencv_highgui.so.3.1.0

심볼릭 링크: (1) -> (2) -> (3)

하지만 이제 나는 다음과 같은 결과를 얻었습니다.

./DisplayImage: 공유 라이브러리를 로드하는 중 오류가 발생했습니다.
lib/libopencv_highgui.so.3.1: 내부 오류

file정보를 확인하기 위해 라이브러리와 실행 파일 모두에서 실행했으며 결과는 다음과 같습니다.

.../opencv/platforms/linux/my_build/lib$ file libopencv_highgui.so.3.1.0
libopencv_highgui.so.3.1.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=1107ba22b36437bedb37dbfe0250626c14759be9, not stripped

.../opencv_sample$ file DisplayImage
DisplayImage: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=aef57fe79d0928ca3afdff8d1b65268e1ad72e77, not stripped

편집하다:
실행하면 readelf -d DisplayImage | grep NEEDED다음이 생성됩니다.

 0x00000001 (NEEDED)                     Shared library: [libopencv_highgui.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libopencv_imgcodecs.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libopencv_core.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
 0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x00000001 (NEEDED)                     Shared library: [ld-linux-armhf.so.3]

을 제외한 모든 항목을 내 타겟에서 찾았습니다 ld-linux-armhf.so.3.

이 "내부 오류" 문제의 원인은 무엇입니까?

답변1

바이너리가 컴파일되면 공유 라이브러리를 사용할 수 있습니다. 이러한 라이브러리는 지원되는 라이브러리 버전을 얻을 수 있도록 버전 번호가 포함된 참조입니다.

때로는 최신 라이브러리를 이전 이름에 연결하는 심볼릭 링크를 사용하여 문제를 해결할 수 있으며, 바이너리는 이 이름을 사용하려고 시도합니다.

그러나 이는 바이너리가 해당 버전을 지원한다는 의미는 아닙니다. 일부 기능이 변경되었거나 일부 기능이 제거 또는 추가되었을 수 있습니다.

따라서 최신 라이브러리 버전에 대해 바이너리를 다시 컴파일하는 것이 좋습니다. 비호환성은 컴파일 타임에 표시됩니다.

ldd를 사용하여 라이브러리 종속성을 볼 수 있습니다.

예;

$ ldd /bin/ls
    linux-vdso.so.1 (0x00007ffc65ff3000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9033f91000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9033bf1000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9033979000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9033771000)
    /lib64/ld-linux-x86-64.so.2 (0x0000558f25845000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9033551000)

편집: ps... libs에는 자체 종속성이 있으므로 복사할 수는 없습니다. 크로스 컴파일 머신에는 컴파일을 위해 유사한 lib 버전이 필요합니다.

관련 정보