lddは私のアプリケーションが「動的実行ファイルではありません」と言います。

lddは私のアプリケーションが「動的実行ファイルではありません」と言います。

私は天文学教授から受け取った32ビットアプリケーション(uclsynという)を持っています。 1年前はCentOSで実行できましたが、今度は新しいCentOS仮想マシンを設定したときに実行されず、理由がわかりません。続いて「死」に戻ります。

コマンドラインでの交換は次のとおりです。

$ ./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 Thu 2月21日 12:50:49 UTC 2013 i686 i686 i386 GNU/Linux

答え1

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

答え2

ここでエラーは、仮想マシンにRAMが不足しているために発生します。実行中は、strace ./programnameライブラリーがロードされる前にプログラムが実行を開始するとすぐにプログラムが終了したことを示します。使用可能なRAMの量を増やすと、プログラムを実行できます。

便利な答え

他の人は役に立つ答えを与えました。つまり、@slmは各ライブラリが存在することを確認するための便利なコマンドを提供し、@lgeorgetはstrace

答え3

元のシステムからリンクされたいくつかのライブラリを公開できますか?不足しているライブラリの一部をインストールする必要があるかもしれません。

通常、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/lsその出力で、コピーが共有.soライブラリをインポートする場所を確認できます。たとえば、librt.so.1ここにあります/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

答え4

依頼者の通訳を試してみると、readelf -l uclsyn_linux 何を見逃しているのか教えてくれます。

関連情報