ldd가 내 애플리케이션이 "동적 실행 파일이 아닙니다"라고 말합니다.

ldd가 내 애플리케이션이 "동적 실행 파일이 아닙니다"라고 말합니다.

나는 천문학 교수로부터 받은 32비트 응용 프로그램(uclsyn이라고 함)을 가지고 있습니다. 1년 전에는 CentOS에서 실행할 수 있었지만 이제 새 CentOS 가상 머신을 설정할 때 실행되지 않고 이유를 모르겠습니다. 계속해서 "죽음"으로 돌아옵니다.

명령줄에서의 교환은 다음과 같습니다.

$ ./uclsyn_linux
Killed

$ ldd ./uclsyn_linux
not a dynamic executable

$ file ./uclsyn_linux
uclsyn_linux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

실행 중인 머신에서 "ldd ./uclsyn_linux"는 전체 종속성 목록을 반환합니다. 이러한 공유 라이브러리를 제공하는 패키지를 찾았는데 모두 설치된 것으로 보입니다.

필수 패키지

  • libSM-1.1.0-7.1.el6.i686
  • libX11-1.3-2.el6.i686
  • libgcc-4.4.6-3.el6.i386
  • glibc-2.12-1.47.el6_2.9.i686
  • libuuid-2.17.2-12.4.el6.i686
  • libXau-1.0.5-1.el6.i686
  • 또한 내가 확인하고 설치한 응용 프로그램의 로컬 라이브러리도 많이 있습니다.

내 환경

VirtualBox에서 CentOS 실행

uname -a:Linux localhost.localdomain 2.6.32-358.el6.i686 #1 SMP Thu 2월 21일 12:50:49 UTC 2013 i686 i686 i386 GNU/Linux

답변1

방금 32비트 바이너리에 문제가 발생했는데 해결책은 다음과 같습니다.

apt-get install gcc-multilib

$ uname -a
Linux bla 2.6.32-028stab094.3 #1 SMP Thu Sep 22 12:47:37 MSD 2011 x86_64 GNU/Linux

답변2

여기서 오류는 가상 머신에 RAM이 부족하여 발생합니다. 실행 중은 strace ./programname라이브러리가 로드되기 전에 프로그램이 실행을 시작하자마자 프로그램이 종료되었음을 나타냅니다. 사용 가능한 RAM의 양을 늘리면 프로그램을 실행할 수 있습니다.

유용한 답변

다른 사람들은 유용한 답변을 제공했습니다. 즉, @slm은 각 라이브러리가 존재하는지 확인하는 유용한 명령을 제공하고 @lgeorget은 strace.

답변3

원래 시스템에서 링크된 일부 라이브러리를 게시할 수 있습니까? 누락된 라이브러리 중 일부를 설치해야 할 수도 있습니다.

일반적으로 CentOS 시스템에서는 다음과 같이 yum 명령을 실행합니다.

yum install <package name>

다음과 같이 원래 시스템에서 역방향으로 작업할 수 있습니다.

$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fff519ff000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00000034e8e00000)
    librt.so.1 => /lib64/librt.so.1 (0x00000034e8a00000)
    libcap.so.2 => /lib64/libcap.so.2 (0x0000003d6fe00000)
    libacl.so.1 => /lib64/libacl.so.1 (0x00000034fae00000)
    libc.so.6 => /lib64/libc.so.6 (0x00000034e7200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000034e7a00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000034e6e00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000034e7e00000)
    libattr.so.1 => /lib64/libattr.so.1 (0x00000034f7600000)

/bin/ls해당 출력에서 ​​내 복사본이 공유 .so 라이브러리를 가져오는 위치를 확인할 수 있습니다 . 예를 들어 librt.so.1여기에 있습니다 /lib64/librt.so.1.

이를 알고 있으면 원래 시스템에서 다음 명령을 실행하여 어떤 패키지가 라이브러리를 제공하는지 확인할 수 있습니다.

$ rpm -qf /lib64/librt.so.1
glibc-2.13-2.x86_64

따라서 패키지 glibc-2.13-2.x86_64를 설치하려면 다음을 수행해야 합니다.

$ sudo yum install glibc-2.13-2.x86_64

답변4

요청자 통역사를 시도해 보면 readelf -l uclsyn_linux 무엇을 놓치고 있는지 알려줄 것입니다.

관련 정보