바이너리 실행 중: 파일을 찾을 수 없습니다.

바이너리 실행 중: 파일을 찾을 수 없습니다.

비슷한 질문이 있다는 것을 알고 있지만 해결책이나 정확한 사례를 찾지 못했습니다. 이 바이너리는 Arch Linux용 GCC 4.7을 사용하여 빌드되었습니다. 이 패키지는 빌드 시스템에서 제대로 작동합니다. 다음 명령은 다음에서 실행됩니다.

Linux vbox-ubuntu 3.2.0-29-generic #46-Ubuntu SMP 금요일 7월 27일 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

문제의 파일은 다음 위치에 있습니다.여기. Linux 64비트에서 Windows 64비트로의 크로스 컴파일러입니다. 압축을 풀어 필요한 모든 것이 포함된 디렉토리를 ~/얻으 세요 .~/mingw64

내가 달리려고 할 때 ~/mingw64/x86_64-w64-mingw32/bin/as얻는 것은 다음과 같습니다.

bash: /home/ruben/mingw64/x86_64-w64-mingw32/bin/as: No such file or directory

달리기는 file ~/mingw64/x86_64-w64-mingw32/bin/as나에게 다음을 주었다:

/home/ruben/mingw64/x86_64-w64-mingw32/bin/as: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x0b8e50955e7919b76967bac042f49c5876804248, not stripped

달리기는 ldd ~/mingw64/x86_64-w64-mingw32/bin/as나에게 다음을 주었다:

    linux-vdso.so.1 =>  (0x00007fff3e367000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2ceae7e000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2ceaac1000)
    /lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f2ceb0a8000)

나는 정말로 헤매고 있다. 어떤 도움이라도 대단히 감사하겠습니다.

편집하다:자세한 내용: 빌드 시스템은 Arch Linux(현재 glibc 2.16)입니다. 출력은 ls -l다음과 같습니다

-rwxr-xr-x 2 ruben users 1506464 11 aug 23:49 /home/ruben/mingw64/bin/x86_64-w64-mingw32-as

출력은 objdump -p다음과 같습니다

Version References:
  required from libz.so.1:
    0x0827e5c0 0x00 05 ZLIB_1.2.0
  required from libc.so.6:
    0x0d696917 0x00 06 GLIBC_2.7
    0x06969194 0x00 04 GLIBC_2.14
    0x0d696913 0x00 03 GLIBC_2.3
    0x09691a75 0x00 02 GLIBC_2.2.5

ldd -vUbuntu 12.04의 출력은 다음과 같습니다.

    linux-vdso.so.1 =>  (0x00007fff225ff000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fd525c71000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd5258b4000)
/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fd525e9b000)

Version information:
/home/ruben/mingw64/x86_64-w64-mingw32/bin/as:
    libz.so.1 (ZLIB_1.2.0) => /lib/x86_64-linux-gnu/libz.so.1
    libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libz.so.1:
    libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6:
    ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
    ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2

테스트된 다른 운영 체제는 Fedora 17(glibc 2.15) 및 Ubuntu 12.04(eglibc 2.15)였습니다. zlib 및 glibc 버전 요구 사항을 충족합니다.

답변1

내 시스템에서 이것을 실행 하면 다음 ldd -v as과 같은 결과를 얻습니다.

./as: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by ./as)
        linux-vdso.so.1 =>  (0x00007fff89ab1000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f1e4c81f000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1e4c498000)
        /lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f1e4ca6d000)

GLIBC_2.14예, 이 바이너리는 시스템에서 누락되었을 수 있는 기호를 찾고 있는 것 같습니다 . svenx가 지적했듯이 해당 기호를 찾고 있는 것 같습니다 memcpy@@GLIBC_2.14. memcpy새 버전을 사용할 수 있는 이유에 대한 자세한 내용을 설명합니다.이 버그 보고서에는.

glibc대상 시스템에 새 버전을 설치하면 문제가 해결됩니다. 이전 버전에서도 작동하도록 바이너리를 다시 빌드하려면 glibc나열된 방법을 시도해 볼 수 있습니다.여기. memcpy필요한 기호만 제공하는 특정 버전의 심을 사용할 수도 있지만 이는 약간 까다롭습니다.


업데이트를 읽은 후: 당신 말이 맞아요, 이것은 당신의 문제가 아닙니다. 하지만 제가 찾은 것 같습니다. 바이너리가 /lib/ld-linux-x86-64.so.2Ubuntu 12.04 시스템에 존재하지 않는 인터프리터를 요청하고 있습니다.

$ readelf -a ./as | grep interpreter
      [Requesting program interpreter: /lib/ld-linux-x86-64.so.2]

ldd어디에서 찾을 수 있는지 알고 있지만 /lib64커널은 언제 바이너리를 실행하려고 하는지 모르고 파일에서 요청한 인터프리터를 찾을 수 없는 것 같습니다. 인터프리터를 통해 수동으로 실행해 볼 수 있습니다.

$ pwd
/home/jim/mingw64/x86_64-w64-mingw32/bin
$ ./as --version
-bash: ./as: No such file or directory
$ /lib64/ld-linux-x86-64.so.2 ./as --version
GNU assembler (rubenvb-4.7.1-1-release) 2.23.51.20120808
Copyright 2012 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `x86_64-w64-mingw32'.

이것이 제대로 작동하는지 100% 확신할 수 없습니다. 내 시스템에서는 gcc이런 식으로 실행되는 분할 오류가 발생합니다. 그러나 그것은 적어도 다른 질문입니다.

답변2

귀하의 질문은64비트 시스템에서 32비트 바이너리를 실행할 때 "찾을 수 없음" 메시지 수신: 존재하지 않는 동적 로더를 언급하는 실행 파일이 있습니다.

귀하의 경우에는 동적 로더가 /lib/ld-linux-x86-64.so.2존재하지만 다른 위치에 있습니다 /lib64/ld-linux-x86-64.so.2. 프로그램을 실행하는 가장 쉬운 방법은 심볼릭 링크를 만드는 것입니다.

ln -s ../lib64/ld-linux-x86-64.so.2 /lib/

관련 정보