这是一个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应用程序。 这个虚拟机是另一个具有相同的根文件系统(包括这个程序)的虚拟机的副本,工作正常。
我已经尝试所有上述作为根和相同的问题。
我提到根文件系统是通过NFS挂载的吗? 然而,它挂载了'默认,nosuid',其中应该包括执行。 此外,我能够从该装入的驱动器运行许多其他程序
的/ proc / cpuinfo中:
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
你的/proc/cpuinfo
的lm
标志表示你的服务器有一个64位的CPU。
来自file prog
的信息表明该程序是为32位体系结构编译的。 尝试安装32个库。 我不熟悉在Gentoo中如何做到这一点,但也许这个Gentoo wiki文章可以帮助。
在尝试在64位安装的Ubuntu上运行Android Debug Bridge时,我遇到了一个类似问题(bash报告文件未find),因为它是为32位编译的。
尝试以下操作:
ldd /usr/local/bin/prog
或者在strace
下运行它:
strace /usr/local/bin/prog
我想这个程序是链接到一个共享库,或者是丢失的,或者是因为错误的架构而编译的。 鉴于它是封闭的来源,要么是可能的。
那么在文件系统mount上设置exec标志呢?
mount -o remount,exec server:/path /mntpoint
如果没有为文件系统设置exec标志,则不能从该文件系统运行可执行文件。
你可以得到的结果,
which prog
cat /proc/cpuinfo
– 我假设你有/proc
小指针,
该文件可能并不真正被命名为“编”。 Unix允许你在文件名中使用任何字符,包括退格,空格等等。例如,文件可以被命名为“p ^ Hprog”,你只能看到“prog”。 既然你有bash,你可以利用自动完成:
> ls ./[TAB] # where [TAB] means you hit the tab key
如果这匹配任何东西,你可以
> mv ./[TAB]
如果您正在编写代码,则需要列出目录中的所有文件,并在文件名中显示每个字符的hex值。
$ 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)
这是可疑的(除非你有一个先进的LESSPIPE)…你可以做吗?
ls -l prog
(对于大小)
xxd prog | head
(用于实际内容)
另外,尝试将其重命名为myprog,然后运行./myprog
是的,我意识到这个问题已经两岁了。 但是这里有一个可能的答案:
execve()在找不到ELF解释器时返回ENOENT。 在我的情况下,我需要从/lib/ld_lsb.so.3 – > ld_linux.so.2符号链接。 这是ELF解释器的Linux标准库指定位置。 在你的发行版中可能会有一个包提供这个符号链接,可能被命名为'lsb'。
我发现这个消息隐藏在PDF中:
要安装32位运行时支持,请执行以下命令:
请注意,这安装了200多个包,需要几分钟才能完成。
这样做可以让我在64位Linux下运行: ldd
以及例如NVIDIA nvflash
二进制文件。