나는 천문학 교수로부터 받은 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
무엇을 놓치고 있는지 알려줄 것입니다.