lddは、アプリが「動的実行可能ファイルではない」と言っています


17

天文学の教授から受け取った32ビットアプリケーション(uclsynと呼ばれる)があります。私は1年前にCentOSで実行することができましたが、今では新しいCentOS VMをセットアップしているときに実行されず、その理由がわかりません。「Kill​​ed」で戻ってきます。

これは、コマンドラインでの交換です。

$ ./uclsyn_linux
Killed

$ ldd ./uclsyn_linux
not a dynamic executable

$ file ./uclsyn_linux
uclsyn_linux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

実行されるマシンでは、「ldd ./uclsyn_linux」は依存関係の全リストを返します。これらの共有ライブラリを提供するパッケージを見つけましたが、それらはすべてインストールされているようです。

必要なパッケージ

  • libSM-1.1.0-7.1.el6.i686
  • libX11-1.3-2.el6.i686
  • libgcc-4.4.6-3.el6.i386
  • glibc-2.12-1.47.el6_2.9.i686
  • libuuid-2.17.2-12.4.el6.i686
  • libXau-1.0.5-1.el6.i686
  • また、アプリケーションにローカルなライブラリのヒープもありますが、これはチェック済みで既にインストールされています。

私の環境

VirtualBoxで実行されているCentOS

uname -a:Linux localhost.localdomain 2.6.32-358.el6.i686#1 SMP木2月21日12:50:49 UTC 2013 i686 i686 i386 GNU / Linux


1
ワイルドな推測:32ビットライブラリがインストールされていない64ビットOSで32ビットバイナリを実行しようとしています。
ミカ

32ビットバイナリですが、インストールしたOSはCentOSの32ビットバージョンです。少なくとも、それはuname-aコマンドが私にそう言っていることですか?
カール

3
@Carl好奇心から、strace ./uclsyn出力は何ですか?それは最初に何が欠けているかについてのヒントを与えるかもしれません。
lgeorget

@lgeorget、以下を返します:execve( "./ uclsyn_linux"、["./uclsyn_linux"]、[/ * 56 vars * /] <unfinished ...> +++ killed by SIGKILL +++
Carl

@Carl OK、それで、いくつかのライブラリをロードしようとするポイントにさえ行かない。strace正しくリンクされていないプログラムを試したことはありません。
lgeorget

回答:


13

32ビットバイナリに問題がありました。解決策は次のとおりです。

apt-get install gcc-multilib

$ uname -a
Linux bla 2.6.32-028stab094.3 #1 SMP Thu Sep 22 12:47:37 MSD 2011 x86_64 GNU/Linux

3
そのライブラリが見つからないことをどのようにして見つけましたか?
イエフダ

1
このソリューションは私のために働いた。+1
フラクタルスペース

@yehudahsかなり長い間、プリコンパイルされた32ビットアプリケーションをLinux上で実行し、さらにリバースエンジニアリングを行ってきたので、トラブルシューティングの経験をいくつか集めました。:D
lama12345

1
素敵な私は間違って何をやっていた私の頭を悩まれたように、これは同様に私のために働いた
マーヴィンいまいましく

1
私にとってもうまくいく:lddは何かを見つけられなかったが、これはうまくいく^^
jy95

8

ここでのエラーは、VirtualMachineに十分なRAMがないことが原因でした。実行中strace ./programnameは、ライブラリをロードする前に、実行を開始した直後にプログラムが強制終了されたことを示しています。使用可能なRAMの量を増やすと、プログラムが機能することが保証されます。

役立つ回答

他の人、つまり、各ライブラリが存在することを確認するための有用なコマンドを提供する@slmと、straceコマンドの試行を提案する@lgeorgetから、いくつかの有用な応答がありました。


5

(元のシステムから)リンクしているライブラリを投稿できますか?不足しているライブラリをインストールする必要がある場合があります。

通常、CentOSシステムでは、次のようにyumコマンドを実行するだけです。

yum install <package name>

次のように元のシステムから逆方向に作業できます。

$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fff519ff000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00000034e8e00000)
    librt.so.1 => /lib64/librt.so.1 (0x00000034e8a00000)
    libcap.so.2 => /lib64/libcap.so.2 (0x0000003d6fe00000)
    libacl.so.1 => /lib64/libacl.so.1 (0x00000034fae00000)
    libc.so.6 => /lib64/libc.so.6 (0x00000034e7200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000034e7a00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000034e6e00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000034e7e00000)
    libattr.so.1 => /lib64/libattr.so.1 (0x00000034f7600000)

その出力で/bin/lslibrt.so.1、たとえば、のコピーが共有.soライブラリを取得している場所を確認できます/lib64/librt.so.1

これを知って、元のシステムでこのコマンドを実行して、このライブラリを提供するパッケージを把握できます。

$ rpm -qf /lib64/librt.so.1
glibc-2.13-2.x86_64

したがって、パッケージはと呼ばれglibc-2.13-2.x86_64ます。それをインストールするには、次のようにします:

$ sudo yum install glibc-2.13-2.x86_64

助けてくれてありがとう。さらに進んでいます。あなたの回答を同じように更新したい場合は、もっと多くの情報で私の質問を更新しました。:)
カール

yum install <package>質問で参照したパッケージはありましたか?
slm

はい、しました。現在はlibuuid.i686以外はすべてインストールされていますが、まだ同じ問題があります。
カール

2

答えはあなたの質問です。1年前にGNU / Linux用にコンパイルされたアプリケーションを実行しようとし、互換性がなくなったり利用できなくなった新しいライブラリで実行しようとします。

この時点で、2つの選択肢があります。あなたがそれを再コンパイルできるなら(私があなたのケースをよく理解しているなら、私は疑います)、それは互換性のあるライブラリと再リンクされるので実行されます。それ以外の場合は、アプリケーションを実行するために、GNUライブラリの古いバージョンで実行されているVMなどの一種のサンドボックスを構築しようとすることができます。


1
これは正しくありません。プログラムは静的にリンクされており、ホストシステム上のライブラリは参照されません。ABIは依然として非互換性を引き起こす可能性がありますが、Linuxカーネルのマイナーリビジョン間(同じアーキテクチャを想定している場合)では起こりそうにありません。
-ckhan

1
静的にリンクされていませんfile。からの出力を参照してください。そしてNo package xyz found、必要なライブラリーが(少なくとも同じパッケージではなく、そうであるように)もはや利用可能ではないことを示唆するようなメッセージ。そのため、可能な場合はプログラムを再構築するか、古いライブラリを使用して動作することがわかっているシステムで実行することをお勧めします。
lgeorget

残念ながら、ここでは再コンパイルはオプションではありません。ここで試しているのと同じ方法で別のシステムで実行していますが、何らかの理由で今回は気に入らないようです。
カール

これは間違っています。アドレスの変更はまったく問題ではありません。ライブラリのメジャーリビジョン(まれですが)で削除される関数やその他のABIブレークが発生します。この場合、libfoo3がインストールされているかどうかにかかわらず、libfoo2がインストールされていない場合はlibfoo2の読み込みエラーが発生します。
-psusi

わかりました。ライブラリの変更はリンクを壊す可能性があると思いました。現在、gentooを実行しています。ライブラリをアップグレードするときに、逆の依存関係を再コンパイルする必要があることが多いため、リンクがライブラリの変更にそれほど抵抗するとは思いませんでした。
lgeorget

0

してみてくださいreadelf -l uclsyn_linux 、あなたが不足している何を教えてくれるプログラムインタプリタを要求します。


1
私は走っreadelf -l <file>同じでファイルに対してldd行動(not a dynamic executable)が、私はすぐに不足しているライブラリを示す何も表示されません。なるほどElf file type is EXEC (Executable file)Entry pointProgram HeadersSection to Segment mapping。出力で正確に何を探す必要がありますか?
StockB

0

アーチLinuxのファイルは、32ビットのエルフであれば、あなたはインストールできlib32が-GCC-libsの問題を解決するために(multilibのリポジトリからの)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.