这是一个gentoo服务器。有一个程序prog
无法执行。(是的,设置了执行权限)
关于文件
$ ls
prog
$ ./prog
bash: ./prog: No such file or directory
$ file prog
prog: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped
$ pwd
/usr/local/bin
$ /usr/local/bin/prog
bash: /usr/local/bin/prog: No such file or directory
$ less prog | head
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
我有一个少花哨的,以表明它是一个实际的可执行文件,这里有一些更多的数据:
$ xxd prog |head
0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000 .ELF............
0000010: 0200 0300 0100 0000 c092 0408 3400 0000 ............4...
0000020: 0401 0a00 0000 0000 3400 2000 0700 2800 ........4. ...(.
0000030: 2600 2300 0600 0000 3400 0000 3480 0408 &.#.....4...4...
0000040: 3480 0408 e000 0000 e000 0000 0500 0000 4...............
0000050: 0400 0000 0300 0000 1401 0000 1481 0408 ................
0000060: 1481 0408 1300 0000 1300 0000 0400 0000 ................
0000070: 0100 0000 0100 0000 0000 0000 0080 0408 ................
0000080: 0080 0408 21f1 0500 21f1 0500 0500 0000 ....!...!.......
0000090: 0010 0000 0100 0000 40f1 0500 4081 0a08 ........@...@...
和
$ ls -l prog
-rwxrwxr-x 1 1000 devs 725706 Aug 6 2007 prog
$ ldd prog
not a dynamic executable
$ strace ./prog
1249403877.639076 execve("./prog", ["./prog"], [/* 27 vars */]) = -1 ENOENT (No such file or directory)
1249403877.640645 dup(2) = 3
1249403877.640875 fcntl(3, F_GETFL) = 0x8002 (flags O_RDWR|O_LARGEFILE)
1249403877.641143 fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
1249403877.641484 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b3b8954a000
1249403877.641747 lseek(3, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
1249403877.642045 write(3, "strace: exec: No such file or dir"..., 40strace: exec: No such file or directory
) = 40
1249403877.642324 close(3) = 0
1249403877.642531 munmap(0x2b3b8954a000, 4096) = 0
1249403877.642735 exit_group(1) = ?
关于服务器
FTR 服务器是一个 xen domU,程序是一个闭源的 linux 应用程序。此 VM 是另一个具有相同根文件系统(包括此程序)的 VM 的副本,可以正常工作。
我已经尝试了以上所有作为 root 和同样的问题。
我有没有提到根文件系统是通过 NFS 安装的。但是它挂载了'defaults,nosuid',其中应该包括执行。我还可以从该安装的驱动器运行许多其他程序
/proc/cpu信息:
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 1
cpu MHz : 2992.692
cache size : 1024 KB
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu tsc msr pae mce cx8 apic mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl cid cx16 xtpr
bogmips : 5989.55
clflush size : 64
cache_alignment : 128
address sizes : 36 bits physical, 48 bits virtual
power management:
我可以运行的文件示例
我可以在该服务器上安装的文件系统上运行其他程序。例如:
$ ls -l ls
-rwxr-xr-x 1 root root 105576 Jul 25 17:14 ls
$ file ls
ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped
$ ./ls
attr cat cut echo getfacl ln more
... (you get the idea) ...
rmdir sort tty
$ less ls | head
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
您的
lm
标志/proc/cpuinfo
表明您的服务器具有 64 位 CPU。来自的信息
file prog
表明该程序是为 32 位架构编译的。尝试安装 32 个库。我不熟悉如何在 Gentoo 中执行此操作,但也许这篇Gentoo wiki 文章可以提供帮助。我在尝试在 64 位安装的 Ubuntu 上运行 Android 调试桥时遇到了一个类似的问题(bash 报告找不到文件),因为它是为 32 位编译的。
尝试以下操作:
或者在下面运行它
strace
:我猜该程序链接到一个共享库,该库要么丢失,要么编译为错误的架构。鉴于它是封闭源代码,任何一种都是可能的。
在文件系统挂载上设置 exec 标志怎么样?
如果没有为文件系统设置 exec 标志,则不能从该文件系统运行任何可执行文件。
你能得到结果吗,
which prog
cat /proc/cpuinfo
- 我假设你有/proc
小指针,
吗(你可以在服务器机器上复制一个,应该在复制后出现在挂载上)
该文件可能并未真正命名为“prog”。Unix 允许您在文件名中使用任何字符,包括退格、空格等。例如,文件可以命名为“p^Hprog”,而您看到的只是“prog”。既然你有 bash,你可以利用自动完成功能:
> ls ./[TAB] # where [TAB] means you hit the tab key
如果这匹配任何东西,你可以
> mv ./[TAB]
如果您正在编写代码,您可能希望列出目录中的所有文件并显示文件名中每个字符的十六进制值。
这很可疑(除非你有高级LESSPIPE)......你能做到吗
(尺寸)
(实际内容)
另外,尝试将其重命名为 myprog 然后运行 ./myprog
是的,我意识到这个问题已经存在两年了。但这里有一个可能的答案:
execve() 在找不到 ELF 解释器时返回 ENOENT。就我而言,我需要来自 /lib/ld_lsb.so.3 -> ld_linux.so.2 的符号链接。这是 ELF 解释器的 Linux Standard Base 指定位置。您的发行版中可能有一个提供此符号链接的软件包,可能命名为“lsb”。
我发现这个花絮隐藏在 PDF 中:
要安装 32 位运行时支持,请执行以下命令:
请注意,这会安装超过 200 个软件包,并且需要几分钟才能完成。
这样做允许我在 64 位 Linux 下运行:
ldd
工作,以及,例如,NVIDIAnvflash
二进制文件......