同じファイルをトレースしてもexecveファイルが見つかりません!質問する

同じファイルをトレースしてもexecveファイルが見つかりません!質問する

知り合いが ' lmutil' の実行中に問題に遭遇したので、 を依頼しましたstrace -f lmutil。なぜexecve「そのようなファイルはありません」と表示されて失敗するのですか!!! まったく同じファイルを strace しているのに、意味がありません!! ここでは一体何が起こっているのでしょうか???

strace -f /home/tabitha/Starprogram/FLEXlm_11.7/linux-x86_64-2.3.4/bin/lmutil

出力:

execve("/home/tabitha/Starprogram/FLEXlm_11.7/linux-x86_64-2.3.4/bin/lmutil", ["/home/tabitha/Starprogram/FLEXlm"...], [/* 38 vars */]) = -1 ENOENT (No such file or directory)
dup(2)                                  = 3
fcntl(3, F_GETFL)                       = 0x8002 (flags O_RDWR|O_LARGEFILE)
fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd7cb8b0000
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
write(3, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
close(3)                                = 0
munmap(0x7fd7cb8b0000, 4096)            = 0
exit_group(1)                           = ?

ldd出力

$ ldd ./lmutil
        linux-vdso.so.1 => (0x00007fffcd5ff000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00007fe40ebbe000)
        libm.so.6 => /lib/libm.so.6 (0x00007fe40e93b000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fe40e724000)
        libc.so.6 => /lib/libc.so.6 (0x00007fe40e3a1000)
        libdl.so.2 => /lib/libdl.so.2 (0x00007fe40e19d000)
        /lib64/ld-lsb-x86-64.so.3 => /lib64/ld-linux-x86-64.so.2 (0x00007fe40edf5000)
$ find . -name lmutil -exec ファイル {} \;
./bin.linux.x86_64/lmutil: ELF 64 ビット LSB 実行ファイル、AMD x86-64、バージョン 1 (SYSV)、GNU/Linux 2.4.0 用、動的リンク (共有ライブラリを使用)、GNU/Linux 2.4.0 用、ストリップ済み
./bin.linux.x86/lmutil: ELF 32 ビット LSB 実行ファイル、Intel 80386、バージョン 1 (SYSV)、GNU/Linux 2.2.5 用、動的リンク (共有ライブラリを使用)、GNU/Linux 2.2.5 用、ストリップ済み
./lmutil: Bourne シェル スクリプトのテキスト実行可能ファイル

ベストアンサー1

実行しようとしているファイル(…/lmutil)は存在しますが、その「ローダー」が存在しません。

  • ネイティブ実行可能ファイルのローダーは動的ローダーです。例/lib/ld-linux.so.2:
  • スクリプトのローダーは、そのシェバン行に記載されているプログラムです。たとえば、/bin/shスクリプトが で始まる場合などです#!/bin/sh

ディレクトリ名から判断すると、これはlmutilamd64 Linux バイナリである可能性が高く、/lib64/ld-linux-x86-64.so.2ローダーとして を探していますが、386 (つまり 32 ビット) ユーザーランドで実行されている amd64 Linux カーネルがあります。プラットフォームに適したバイナリを取得する必要があります。

この状況は、Unix の最も誤解を招くエラー メッセージであると私は考えています。残念ながら、これを修正するのは難しいでしょう。カーネルはプログラムの呼び出し元に数値エラー コードしか報告できないため、「コマンドが見つかりません」( ) のみを報告でき、探しているローダーの名前を報告できません。これは、 が役に立たないENOENTまれなケースの 1 つです。strace

おすすめ記事