Linksys WRVS4400Nのファームウェアをコンパイルしようとしています。
ls
はそれが存在することを示していますが、実行しようとすると、bashはそれが存在しないことを示します。 cat
することもできます。これは実行可能ファイルであり、シェルスクリプトではありません。
file mkdep
の出力は32-bit elf
であるとおっしゃいました。 64ビットVMを実行しています。
例:
$ uname -m
x86_64
$ ls -l ./example
-rwxr-xr-x 1 root root 92312 2011-08-18 16:52 ./example
$ file ./example
example: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped
$ ./example
-bash: ./example: No such file or directory
新しい32ビットVMを作成し、そこでコンパイルします。
実行可能に設定されていますか?そうでない場合は、chmod +x filename
。それはあなたのPATHにありますか?そうでない場合は、単にfilename
ではなく./filename
として呼び出します。
ファイルを実行しようとしたときにbashがファイルが存在しないと言った場合、bashはファイルがスクリプトであると信じており、最初の行(#!)で指定されたインタープリターが存在しないことを意味する場合があります。
ファイルの名前がmkdep
の場合、出力を投稿します
./mkdep
file mkdep
hd mkdep | head
strace ./mkdep 2>mkdep.strace.txt
Straceコマンドは、行われたシステムコールに関する情報を提供します(例:strace ls 2>ls.t
以下をls.tに入れます
execve( "/ bin/ls"、["ls"]、[/ * 22 vars * /])= 0 brk(0)= 0x8061000 access( " /etc/ld.so.nohwcap "、F_OK)= -1 ENOENT(そのようなファイルまたはディレクトリはありません) mmap2(NULL、8192、PROT_READ | PROT_WRITE、MAP_PRIVATE | MAP_ANONYMOUS、-1、0)= 0xb7f82000 access( "/ etc/ld.so.preload"、R_OK)= -1 ENOENT(そのようなファイルまたはディレクトリはありません) open( "/ etc/ld.so.cache"、O_RDONLY) = 3 fstat64(3、{st_mode = S_IFREG | 0644、st_size = 32311、...})= 0 mmap2(NULL、32311、PROT_READ、MAP_PRIVATE、3、0)= 0xb7f7a000 close(3)= 0 access( "/ etc/ld.so.nohwcap"、F_OK)= -1 ENOENT(そのようなファイルまたはディレクトリはありません) open( " /lib/librt.so.1"、O_RDONLY)= 3 read(3、 "\ 177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240\30\0\0004\0\0\0 "...、512)= 512 fstat64(3、{st_mode = S_IFREG | 0644、st_size = 30624、...})= 0
スクリプトのIFSを変更していますか?私も自分のスクリプトの1つで同じ問題に遭遇し、同じように思いました(32ビットファイルが64ビットマシンのシェルスクリプトによって読み取られています)。しかし、私の場合はそれは問題ではありませんでした。代わりに、IFSをコンマ '、'に変更し、改行してパーサーを混乱させ、このエラーを引き起こしていました。
IFSの変更を削除したところ、正常に機能するようになりました。