실행 파일에“이러한 파일이나 디렉토리가 없습니다.”파일이 존재하지만 ldd는 모든 라이브러리가 있다고보고합니다.


13

따라서 다른 명령으로 실행 파일이 존재하지만 실행하려고하면 파일이 없다고 주장합니다.

"고양이"를 통해 이름을 변경했기 때문에 이름에 특수 문자가 아닙니다. 그리고 그것은 올바른 아키텍쳐를위한 바이너리 (binary) 인 것 같습니다.

LDD XLS

    linux-gate.so.1 =>  (0xb77bc000)
    libQtGui.so.4 => /usr/lib/i386-linux-gnu/libQtGui.so.4 (0xb6cc2000)
    libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xb6c98000)
    libSM.so.6 => /usr/lib/i386-linux-gnu/libSM.so.6 (0xb6c8f000)
    libICE.so.6 => /usr/lib/i386-linux-gnu/libICE.so.6 (0xb6c76000)
    libXrender.so.1 => /usr/lib/i386-linux-gnu/libXrender.so.1 (0xb6c6d000)
    libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xb6bd1000)
    libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0xb6b9b000)
    libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xb6b88000)
    libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xb6a50000)
    libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xb6a2a000)
    libQtSql.so.4 => /usr/lib/i386-linux-gnu/libQtSql.so.4 (0xb69ea000)
    libQtCore.so.4 => /usr/lib/i386-linux-gnu/libQtCore.so.4 (0xb6704000)
    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb66ea000)
    libgthread-2.0.so.0 => /usr/lib/i386-linux-gnu/libgthread-2.0.so.0 (0xb66e7000)
    libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb65ea000)
    libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb6598000)
    librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xb658f000)
    libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb6575000)
    libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xb6571000)
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb6485000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6468000)
    libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb6305000)
    libaudio.so.2 => /usr/lib/i386-linux-gnu/libaudio.so.2 (0xb62ea000)
    libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xb62e4000)
    libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0xb62ba000)
    libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6297000)
    /lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xb77bd000)
    libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb6258000)
    libffi.so.5 => /usr/lib/i386-linux-gnu/libffi.so.5 (0xb624f000)
    libXt.so.6 => /usr/lib/i386-linux-gnu/libXt.so.6 (0xb61f1000)
    libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xb61ee000)
    libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xb61e8000)

uname -m (또한 배포본은 Debian wheezy입니다.)

i686

파일 xls

xls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
     dynamically linked (uses shared libs), for GNU/Linux 2.6.15,
     BuildID[sha1]=0xa9786f61b371a683ae4306792f95e0636c288883, not stripped

ls -ld xls

-rwxr-xr-x 1 root root 4634064 May 20 14:35 xls

고양이

root@pc170:# cat xls > zls
root@pc170:# ./zls
-su: ./zls: Permission denied
root@pc170:# chmod +x zls
root@pc170:# ./zls
-su: ./zls: No such file or directory

시각

root@pc170:# time ./zls
-su: ./zls: No such file or directory

real    0m0.002s
user    0m0.000s
sys     0m0.000s

1
무엇에 대해 LD_DEBUG=all /lib/ld-lsb.so.3 ./zls?
Stéphane Chazelas

1
이것에 대한 한 가지 : 프로그램 내부에서 또는 무언가를 "su: "실행하는 것처럼 보이게하고 실행 system()후에 su는 디렉토리에서 실행 파일을 찾을 수 없다고 말합니다. 복사하거나 심볼릭 링크를 /bin하시겠습니까?
Bratchley

시도합시다 objdump -j .interp -s ./zls. 존재하지 않는 파일을 나열 할 것으로 생각됩니다.
derobert

답변:


20

로더없는 것 같습니다 . 간단한 이야기 ​​: 프로그램에서 예상 한 동적 로더가 누락되었으며이 경우 오류 메시지가 잘못 표시됩니다. 이전에 논의하지 않았다고 생각하기 때문에의 출력 중 관련 부분을 설명하겠습니다 ldd. 그것의 대부분은 형태의 선으로 구성 library_soname => /path/to/library_file됩니다.

/lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xb77bd000)

라이브러리 중에는 공유 라이브러리가 아닌 것을 볼 수 있습니다. 공유 라이브러리를로드하는 프로그램입니다. 프로그램이 요청 /lib/ld-lsb.so.3중이지만 커널이 찾지 못하여 "No such file or directory"라고보고합니다. 그러나 ldd때문에 로더를 찾을 않는 ldd특수한 환경에서 하드 코딩 로더를 호출하는 래퍼 스크립트이며, 로더는 관계없이 항상 프로그램이 예상 것을 로더 경로 자신의 경로를보고합니다.

당신은이 /lib/ld-linux.so.2는 IS 시스템에 사실상 x86_32 리눅스 시스템에서 ELF 로더에 대한 표준 위치. 이 프로그램은 필요 /lib/ld-lsb.so.3인, 법률 상 표준 위치.

배포판의 최소 LSB 지원 (예 : lsb-core데비안 패키지)을 설치하십시오 . 배포판에없는 경우 (대부분의 경우) 심볼릭 링크를 만듭니다 /lib/ld-lsb.so.3 -> ld-linux.so.2. 필사적으로 로더를 명시 적으로 호출 할 수 있습니다 /lib/ld-linux.so.2 ./xls.


실제로, 로더는 그 objdump 라인이 인쇄했을 것입니다. 실제로 ldd출력 에 있다는 것을 잊었습니다 . 잘 잡아!
derobert

이것은 잘못된 오류 메시지와 함께 내가 본 문제입니다. 하나의 문제는 동적 로더가 존재하지 않으면 '최소한 속도로'쉘 스크립트이기 때문에 'ldd'가 실행되지 않는다는 것입니다.
dajobe

64 비트 시스템에서 누락 된 32 비트 라이브러리에 대해 이야기하는 게시물 중이 가장 유용한 게시물에 감사드립니다.
Michael Burr

readelf -a zls | grep "Requesting program interpreter"로더를 인쇄합니다.
케빈 스미스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.