파일이 존재하고 PATH에 있어도 "파일을 찾을 수 없음" 메시지와 함께 Linux 실행 파일이 실패합니다.

파일이 존재하고 PATH에 있어도 "파일을 찾을 수 없음" 메시지와 함께 Linux 실행 파일이 실패합니다.

실행 파일(버전 2.12)을 시작하고 싶지만 wine다음 오류가 발생합니다( $=shell 프롬프트).

$ wine
bash: /usr/bin/wine: No such file or directory
$ /usr/bin/wine
bash: /usr/bin/wine: No such file or directory
$ cd /usr/bin
$ ./wine
bash: ./wine: No such file or directory

그러나 파일은 다음과 같습니다.

$ which wine
/usr/bin/wine

실행 파일이 확실히 존재하며 죽은 심볼릭 링크가 없습니다.

$ stat /usr/bin/wine
  File: /usr/bin/wine
  Size: 9712            Blocks: 24         IO Block: 4096   regular file
Device: 802h/2050d      Inode: 415789      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-07-13 13:53:00.000000000 +0200
Modify: 2017-07-08 03:42:45.000000000 +0200
Change: 2017-07-13 13:53:00.817346043 +0200
 Birth: -

32비트 ELF입니다.

$ file /usr/bin/wine
/usr/bin/wine: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, 
BuildID[sha1]=eaf6de433d8196e746c95d352e0258fe2b65ae24, stripped

실행 파일의 동적 부분을 얻을 수 있습니다.

$ readelf -d /usr/bin/wine
Dynamic section at offset 0x1efc contains 27 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libwine.so.1]
 0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000001d (RUNPATH)                    Library runpath: [$ORIGIN/../lib32]
 0x0000000c (INIT)                       0x7c000854
 0x0000000d (FINI)                       0x7c000e54
 [more addresses without file names]

그러나 다음을 사용하여 공유 객체 종속성을 나열할 수 없습니다 ldd.

$ ldd /usr/bin/wine
/usr/bin/ldd: line 117: /usr/bin/wine: No such file or directory

strace보여주다:

execve("/usr/bin/wine", ["wine"], 0x7fff20dc8730 /* 66 vars */) = -1 ENOENT (No such file or directory)
fstat(2, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
getpid()                                = 23783
exit_group(1)                           = ?
+++ exited with 1 +++

@jww의 제안을 추가하도록 편집되었습니다.ld: 디버그 메시지가 생성되지 않으므로 동적 링크 라이브러리가 요청되기 전에 문제가 발생하는 것 같습니다.

$ LD_DEBUG=all wine
bash: /usr/bin/wine: No such file or directory

가능한 값만 출력해도 LD_DEBUG오류가 발생함

$ LD_DEBUG=help wine
bash: /usr/bin/wine: No such file or directory

@Raman Sailopal의 제안을 추가하도록 편집되었습니다./usr/bin/wine이미 생성된 다른 파일에 내용을 복사하면 동일한 오류가 발생하므로 문제가 실행 파일에 있는 것 같습니다.

root:bin # cp cat testcmd    

root:bin # testcmd --help
Usage: testcmd [OPTION]... [FILE]...
Concatenate FILE(s) to standard output.
[rest of cat help page]

root:bin # dd if=wine of=testcmd  
18+1 records in
18+1 records out
9712 bytes (9.7 kB, 9.5 KiB) copied, 0.000404061 s, 24.0 MB/s

root:bin # testcmd
bash: /usr/bin/testcmd: No such file or directory

무엇이 문제이며 누락된 파일이나 디렉터리를 찾으려면 어떻게 해야 합니까?


uname -a:

Linux laptop 4.11.3-1-ARCH #1 SMP PREEMPT Sun May 28 10:40:17 CEST 2017 x86_64 GNU/Linux

답변1

이것:

$ file /usr/bin/wine
/usr/bin/wine: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, 
BuildID[sha1]=eaf6de433d8196e746c95d352e0258fe2b65ae24, stripped

이것과 결합하면:

$ ldd /usr/bin/wine
/usr/bin/ldd: line 117: /usr/bin/wine: No such file or directory

/lib/ld-linux.so.2시스템에 ELF 해석기가 없는 것이 좋습니다 . 즉, 이 64비트 시스템에는 32비트 호환성 라이브러리가 설치되어 있지 않습니다. 따라서 @ user1334609의 답변은 기본적으로 정확합니다.

답변2

64비트 운영 체제에서 32비트 애플리케이션을 실행하려고 하므로 이를 실행하려면 32비트 호환성 라이브러리(특히 glibc)를 설치해야 합니다.

답변3

참고로 알파인 기반 도커 이미지에서 동일한 문제가 실행 중이었습니다. 실행 파일은 64비트 ELF이고 알파인 이미지는 64비트이며 실행 파일은 다른 컨테이너에서 작동합니다. 따라서 아마도 정리된 알파인 라이브러리는 내 실행 파일과 호환되지 않을 것입니다. 이것node.js Docker 중앙 페이지노트:

중대한 경고[Alpine 기반 컨테이너에서 실행]응, 그건 사용하고 있어muslerlibc바꾸다glibc와 친구들, 따라서 일부 소프트웨어에는 libc 요구 사항의 깊이에 따라 문제가 있을 수 있습니다. 그러나 대부분의 소프트웨어에는 이 문제가 없으므로 일반적으로 이 변형이 매우 안전한 선택입니다. 바라보다이 해커 뉴스 댓글 스레드Alpine 기반 이미지 사용에 대한 가능한 문제 및 일부 장단점 비교에 대해 자세히 논의합니다.

내 솔루션은 다른(예: Debian Jessie 기반) 컨테이너 이미지를 사용하는 것이었습니다.

답변4

저는 user1334609가 언급한 대로 64비트 OS에서 32비트 응용 프로그램을 실행하려고 하므로 32비트 호환성 라이브러리를 설치해야 합니다. 저는 우분투에 있어서 이렇게 했습니다:

dpkg --add-architecture i386
apt update
apt install libc6-i386

작동했고 내 elf 파일이 ld-linux를 찾을 수 있었습니다. 그런 다음 일부 라이브러리를 로드하지 못했고 하나씩 문제를 해결했습니다.

관련 정보