実行可能ファイルに「そのようなファイルまたはディレクトリはありません」が、ファイルが存在し、lddが存在するすべてのライブラリを報告する


13

したがって、他のコマンドによって実行可能ファイルが存在しますが、実行しようとすると、実行可能ファイルは存在しないと主張します。

名前の特殊文字ではありません。「猫」という名前に変更しました。そして、それは正しいアーキテクチャのバイナリのようです...「どうやら」、質問は、他にtatエラーメッセージBESIDESがスローされるものだと思います。

ldd xls

    linux-gate.so.1 =>  (0xb77bc000)
    libQtGui.so.4 => /usr/lib/i386-linux-gnu/libQtGui.so.4 (0xb6cc2000)
    libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xb6c98000)
    libSM.so.6 => /usr/lib/i386-linux-gnu/libSM.so.6 (0xb6c8f000)
    libICE.so.6 => /usr/lib/i386-linux-gnu/libICE.so.6 (0xb6c76000)
    libXrender.so.1 => /usr/lib/i386-linux-gnu/libXrender.so.1 (0xb6c6d000)
    libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xb6bd1000)
    libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0xb6b9b000)
    libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xb6b88000)
    libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xb6a50000)
    libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xb6a2a000)
    libQtSql.so.4 => /usr/lib/i386-linux-gnu/libQtSql.so.4 (0xb69ea000)
    libQtCore.so.4 => /usr/lib/i386-linux-gnu/libQtCore.so.4 (0xb6704000)
    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb66ea000)
    libgthread-2.0.so.0 => /usr/lib/i386-linux-gnu/libgthread-2.0.so.0 (0xb66e7000)
    libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb65ea000)
    libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb6598000)
    librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xb658f000)
    libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb6575000)
    libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xb6571000)
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb6485000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6468000)
    libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb6305000)
    libaudio.so.2 => /usr/lib/i386-linux-gnu/libaudio.so.2 (0xb62ea000)
    libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xb62e4000)
    libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0xb62ba000)
    libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6297000)
    /lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xb77bd000)
    libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb6258000)
    libffi.so.5 => /usr/lib/i386-linux-gnu/libffi.so.5 (0xb624f000)
    libXt.so.6 => /usr/lib/i386-linux-gnu/libXt.so.6 (0xb61f1000)
    libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xb61ee000)
    libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xb61e8000)

uname -m(また、私のディストリビューションはDebian wheezyです。)

i686

ファイルxls

xls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
     dynamically linked (uses shared libs), for GNU/Linux 2.6.15,
     BuildID[sha1]=0xa9786f61b371a683ae4306792f95e0636c288883, not stripped

ls -ld xls

-rwxr-xr-x 1 root root 4634064 May 20 14:35 xls

ネコ

root@pc170:# cat xls > zls
root@pc170:# ./zls
-su: ./zls: Permission denied
root@pc170:# chmod +x zls
root@pc170:# ./zls
-su: ./zls: No such file or directory

時間

root@pc170:# time ./zls
-su: ./zls: No such file or directory

real    0m0.002s
user    0m0.000s
sys     0m0.000s

1
どうLD_DEBUG=all /lib/ld-lsb.so.3 ./zls
ステファンシャゼル

1
これに関する1つのこと:それは"su: "あなたがsystem()プログラムの中から何かを実行しているように見え、それを実行した後、suそれが終わるディレクトリで実行可能ファイルを見つけることができないと言っています。コピーまたはシンボリックリンク/binまたは何か?
ブラッチリー

やってみましょうobjdump -j .interp -s ./zls。存在しないファイルがリストされると思います。
デロバート

回答:


20

これは、欠落しているローダーのように見えます。短編:プログラムが期待するダイナミックローダーが欠落しており、この場合エラーメッセージは誤解を招く可能性があります。これについては以前に説明したことはないと思うので、の出力の関連部分について説明させてくださいldd。そのほとんどは、次の形式の行で構成されていlibrary_soname => /path/to/library_fileます。

/lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xb77bd000)

ライブラリの中には、共有ライブラリではないものがあります。それは、共有ライブラリをロードするプログラムです。プログラムはを要求/lib/ld-lsb.so.3していますが、カーネルはそれを見つけられないため、「No such file or directory」と報告します。ただし、特別な環境でハードコーディングされたローダーを呼び出すラッパースクリプトであるlddため、ローダーは検出lddされます。また、ローダーは、プログラムがどのローダーパスを期待していても、常に独自のパスを報告します。

あなたは持って/lib/ld-linux.so.2いる、あなたのシステム上の事実上の x86_32 LinuxシステムでELFローダーの標準的な場所。プログラムが必要/lib/ld-lsb.so.3である、デジュール標準位置。

ディストリビューションの最小限のLSBサポート、たとえばlsb-coreDebian のパッケージをインストールします。ディストリビューションにそれがない場合(ほとんどの場合)、シンボリックリンクを作成します/lib/ld-lsb.so.3 -> ld-linux.so.2。必死に、ローダーを明示的に呼び出すことができます:/lib/ld-linux.so.2 ./xls


実際、ローダーはそのobjdump行が出力するものです。実際にldd出力にあったことを忘れていました。良いキャッチ!
デロバート

これはまさに私が見た問題であり、誤解を招くようなエラーメッセージが表示されます。1つの問題は、ダイナミックローダーがシェルスクリプト(少なくともセントス上)であるために存在しない場合、「ldd」が実行されないことです。
ダジョブ

64ビットシステムで32ビットライブラリが見つからないことについて語る投稿の中で、この最も役立つ投稿をありがとう。
マイケルバー

readelf -a zls | grep "Requesting program interpreter"ローダーを印刷します。
ケビンスミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.