ldd는 내 앱이 "동적 실행 파일이 아님"이라고 알려줍니다.


17

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

이것은 명령 행에서의 교환입니다.

$ ./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 Feb 21 12:50:49 UTC 2013 i686 i686 i386 GNU / Linux


1
거친 추측 : 32 비트 라이브러리가 설치되지 않은 64 비트 OS에서 32 비트 바이너리를 실행하려고합니다.
마이카

32 비트 바이너리이지만 설치 한 OS는 32 비트 버전의 CentOS입니다. 적어도 그것이 uname-a 명령이 예라고 말하는 것입니까?
Carl

3
@Carl 호기심에서 strace ./uclsyn출력은 무엇입니까? 먼저 누락 된 부분에 대한 힌트를 얻을 수 있습니다.
lgeorget

@lgeorget, execve ( "./ uclsyn_linux", [ "./uclsyn_linux"], [/ * 56 vars * /] <미완료 ...> +++ SIGKILL +++
Carl

@Carl Ok, 라이브러리를로드하려고하는 시점조차 가지 않습니다. strace프로그램이 올바르게 연결되지 않은 적이 있습니다.
lgeorget

답변:


13

방금 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

3
lib가없는 것을 어떻게 알았습니까?
yehudahs

1
이 솔루션은 저에게 효과적이었습니다. +1
FractalSpace

@yehudahs Linux에서 미리 컴파일 된 32 비트 응용 프로그램을 많이 실행하고 리버스 엔지니어링을 수행했기 때문에 문제 해결 경험을 수집했습니다. : D
lama12345

1
내가 잘못하고있는 일을 머리를 긁적뿐만 아니라 이것은 나를 위해 일한 좋은
Marvin Effing

1
나에게도 효과가 있습니다 : ldd는 무언가를 찾지 못했지만 ^^
jy95

8

여기서 오류는 VirtualMachine에 충분한 RAM이 없기 때문입니다. Running strace ./programname은 라이브러리를로드하기 전에 프로그램이 시작된 그대로 종료되었음을 나타냅니다. 사용 가능한 RAM의 양을 늘리면 프로그램이 작동 할 수있었습니다.

유용한 답변

다른 사람들, 즉 각 라이브러리가 존재하는지 확인하는 유용한 명령을 제공 한 @slm과 strace명령 시도를 제안하는 @lgeorget의 유용한 응답이있었습니다 .


5

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

일반적으로 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

도움을 주셔서 대단히 감사합니다. 더 나아지고 있어요 같은 질문으로 답변을 업데이트하려면 지금 더 많은 정보로 내 질문을 업데이트했습니다. :)
Carl

당신은나요 yum install <package>당신이 당신의 질문에 언급 된 것과 패키지?
slm

그래, 내가 했어. libuuid.i686을 제외하고 모두 설치되었지만 여전히 동일한 문제가 있습니다.
Carl

2

대답은 당신의 질문에 있습니다 : 1 년 전에 GNU / Linux 용으로 컴파일 된 응용 프로그램을 실행하려고 시도하고 더 이상 호환되지 않거나 사용할 수없는 새로운 라이브러리로 실행하려고합니다.

이 시점에서 두 가지 선택이 있습니다. 다시 컴파일 할 수 있다면 (귀하의 사례를 잘 이해하면 의심 스럽습니다) 호환되는 라이브러리와 다시 연결되기 때문에 실행됩니다. 그렇지 않으면 예를 들어 이전 버전의 GNU 라이브러리로 실행되는 VM과 같은 일종의 샌드 박스를 만들어 응용 프로그램을 실행할 수 있습니다.


1
이것은 정확하지 않습니다. 프로그램이 정적으로 링크되어 있으며 호스트 시스템의 라이브러리는 참조되지 않습니다. ABI는 여전히 비 호환성을 야기 할 수 있지만, 약간의 리눅스 커널 버전 (같은 아키텍처를 가정 할 경우)에는 거의 없을 것입니다.
ckhan

1
정적으로 연결되어 있지 않습니다 file. 의 출력을 참조하십시오 . 그리고 같은 메시지 No package xyz found는 필요한 라이브러리가 더 이상 사용 가능하지 않다는 것을 암시합니다 (적어도 동일한 패키지에서 사용 된 방식은 아님). 그렇기 때문에 가능한 경우 프로그램을 다시 작성하거나 오래된 라이브러리를 사용하여 작동하는 것으로 알려진 시스템에서 프로그램을 실행하는 것이 좋습니다.
lgeorget

불행히도 재 컴파일은 옵션이 아닙니다. 여기에서 시도하는 것과 같은 방식으로 다른 시스템에서 실행하고 있지만 어떤 이유로 든 좋아하지 않습니다.
Carl

이것은 잘못이다. 주소 변경은 전혀 중요하지 않습니다. 제거되는 함수 또는 다른 ABI 중단은 라이브러리의 주요 개정판 (드문 경우)에서 발생하며,이 경우 libfoo3 설치 여부에 관계없이 libfoo2가 설치되어 있지 않은 경우 libfoo2를로드하면 오류가 발생합니다.
psusi

알았어요 라이브러리를 변경하면 연결이 끊어 질 수 있다고 생각했습니다. 나는 현재 젠투를 실행 중이며 라이브러리를 업그레이드 할 때 종종 역방향 종속성을 다시 컴파일해야하므로 링크가 라이브러리 변경에 너무 저항 적이라고 생각하지 않았습니다.
lgeorget

0

try readelf -l uclsyn_linux 프로그램 통역사에게 누락 된 내용을 알려줄 것입니다.


1
readelf -l <file>동일한 ldd동작 ( not a dynamic executable)을 가진 파일에 대해 실행 했지만 라이브러리가 없음을 나타내는 아무것도 즉시 표시되지 않습니다. 내가보고 Elf file type is EXEC (Executable file), Entry point, Program HeadersSection to Segment mapping. 출력에서 정확히 무엇을 찾아야합니까?
StockB

0

에서 아치 리눅스 파일이 32 비트 엘프 인 경우, 당신은 설치할 수 있습니다 lib32-GCC-libs와 문제를 해결하기 위해 (multilib 저장소를).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.