これは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サーバーはxendomUであり、プログラムはクローズドソースのLinuxアプリケーションです。このVMは、同じルートファイルシステム(このプログラムを含む)を持つ別のVMのコピーであり、正常に動作します。
私は上記のすべてを根本的な同じ問題として試しました。
ルートファイルシステムがNFSを介してマウントされていることを述べました。ただし、「defaults、nosuid」がマウントされており、executeが含まれている必要があります。また、マウントされたドライブから他の多くのプログラムを実行することができます
/ 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記事 が役立つでしょう。
Ubuntuの64ビットインストールでAndroid Debug Bridgeを実行しようとすると、32ビット用にコンパイルされているため、同様の問題が発生しました(bashがファイルが見つからないことを報告します)。
次のことを試してください。
ldd /usr/local/bin/prog
または、strace
で実行します。
strace /usr/local/bin/prog
プログラムは、欠落しているか、間違ったアーキテクチャ用にコンパイルされている共有ライブラリに対してリンクされていると思います。クローズドソースであることを考えると、どちらも可能です。
ファイルシステムのマウントにexecフラグを設定するのはどうですか?
mount -o remount,exec server:/path /mntpoint
ファイルシステムにexecフラグが設定されていない場合、そのファイルシステムから実行可能ファイルを実行することはできません。
ファイルの名前は実際には「prog」ではない可能性があります。 Unixでは、バックスペースやスペースなど、ファイル名に任意の文字を使用できます。たとえば、ファイルの名前は「p ^ Hprog」で、表示されるのは「prog」だけです。あなたはbashを持っているので、オートコンプリートを利用することができます:
> ls ./[TAB] # where [TAB] means you hit the tab key
それが何かに一致する場合は、
> mv ./[TAB]
コードを記述している場合は、ディレクトリ内のすべてのファイルを一覧表示し、ファイル名の各文字の16進値を表示する必要があります。
$ 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を実行してみてください。
はい、この質問は2歳です。しかし、考えられる答えは次のとおりです。
execve()は、ELFインタープリターが見つからない場合にENOENTを返します。私の場合、/ lib/ld_lsb.so.3-> ld_linux.so.2からのシンボリックリンクが必要でした。これは、ELFインタープリター用にLinux StandardBaseで指定された場所です。おそらく「lsb」のような名前のこのシンボリックリンクを提供するパッケージがディストリビューションにある可能性があります。
の結果を得ることができますか、
which prog
cat /proc/cpuinfo
-/proc
があると思います小さなポインタ、
私はこの一口がPDFの中に埋もれているのを見つけました:
32ビットランタイムサポートをインストールするには、次のコマンドを実行します。
これにより200を超えるパッケージがインストールされ、完了するまでに数分かかることに注意してください。
これを行うことで、64ビットLinux:ldd
で実行でき、たとえばNVIDIA nvflash
バイナリ...