執行二進製文件:找不到文件
我知道那裡有類似的問題,但我沒有找到解決方案,也沒有找到這個確切的案例。該二進製文件是使用其 GCC 4.7 在 Arch Linux 上建構的。該軟體包在建構系統上執行良好。以下命令執行於:
Linux vbox-ubuntu 3.2.0-29-generic #46-Ubuntu SMP Fri Jul 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 -v
在 Ubuntu 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 版本要求都滿足。
如果我
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
這種方式執行會導致分段錯誤。但這至少是一個不同的問題。