执行二进制文件:找不到文件

执行二进制文件:找不到文件

我知道那里有类似的问题,但我还没有找到解决方案,也没有找到这个确切的案例。该二进制文件是使用 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.2,而 Ubuntu 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/

相关内容