私はしばらくの間、Optwareを使用してARMベースのNASにパッケージをインストールしてきました。Transmission、Sambaなどの通常のものです。しかし、起動して間もなくトランスミッションがハングするという問題が発生していました。しばらくの間解決策を探しましたが、最終的に、使用していたOptwareフィードがNASボックス用に設定されたものではないことがわかりました。フィードを切り替えてすべてのパッケージを再インストールしましたが、再インストールしたものを実行しようとすると、次のエラーが発生します。
$ smbd
-bash: /opt/sbin/smbd: No such file or directory
$ transmission-daemon
-bash: /opt/bin/transmission-daemon: No such file or directory
$ unrar
-bash: /opt/bin/unrar: No such file or directory
/opt/bin
を確認しました および/opt/sbin
実行可能ファイルは間違いなくそこにあります–それで、本当の問題は何ですか?
$ ldd /opt/bin/transmission-daemon
/usr/bin/ldd: line 116: /opt/bin/transmission-daemon: No such file or directory
$ file /opt/bin/transmission-daemon
/opt/bin/transmission-daemon: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), stripped
$ readelf - l /opt/sbin/smbd
readelf: error while loading shared libraries: libc.so.0: cannot open shared object file: No such file or directory
$ cat /proc/$$/maps
…
40084000-4019e000 r-xp 00000000 09:01 112594 /lib/libc-2.7.so
…
それが何を意味するのかわかりませんが、ファイルがであることを証明しています そこだよね?それとも、これは共有ライブラリと関係がありますか?
承認された回答:
「ローダー」に依存するファイルの実行に失敗すると、発生するエラーは、実行しているファイルではなくローダーを参照している可能性があります。
- 動的にリンクされたネイティブ実行可能ファイルのローダーは、動的ライブラリのロードを担当するシステムの一部です。
/lib/ld.so
のようなものです または/lib/ld-linux.so.2
、実行可能ファイルである必要があります。 - スクリプトのローダーは、シバンの行に記載されているプログラムです。
/bin/sh
#!/bin/sh
で始まるスクリプトの場合 。
エラーメッセージは、ローダーが問題であることを示さないという点でかなり誤解を招く可能性があります。残念ながら、カーネルインターフェイスには数値エラーコードを報告する余地しかなく、エラーが実際には別のファイルに関係していることを示す余地がないため、これを修正するのは困難です。一部のシェルは、スクリプトに対して自身で機能します(#!
を読み取る スクリプトの行とエラー状態の再処理)が、ネイティブバイナリに対して同じことを試みているのを見たことがありません。
ldd
は、いくつかの特別な環境変数を設定してからプログラムを実行し、ローダーに作業を任せることで機能するため、バイナリでも機能していません。 strace
カーネルが報告する以上の情報を報告しないため、意味のある情報も提供しません。また、これまで見てきたように、カーネルは認識しているすべての情報を報告することはできません。
ここに、再インストールした実行可能ファイル(smbd
、transmission-daemon
など)が、システムに存在しないローダーを要求しています。そのため、新しいフィードもシステムに適していません。
この状況は、正しいシステム(またはシステムのファミリー)とスーパーアーキテクチャーに対してバイナリーを実行しようとしたが、サブアーキテクチャーが間違っている場合によく発生します。ここでは、ELFバイナリを期待するシステムにELFバイナリがあるため、カーネルはそれらを適切にロードします。これらはARMプロセッサ上で実行されるARMバイナリであるため、命令は意味をなし、ローダーを探すことができるポイントまでプログラムを取得します。しかし、それは間違ったローダーです。
今、私は推測し始めていますが、あなたの新しいフィードは間違ったARMABI用であると思われます。 ABIは、プロシージャ間呼び出しを行うための、特にライブラリ関数を呼び出すための共通言語です。一部のプロセッサアーキテクチャでは、いくつかの可能なABIの選択肢があり、そのうちの1つを選択して、それを一貫して使用する必要があります。 Linuxディストリビューションを備えた2つのARMABIがあります。従来のarm-elf
ABI、および新しいEABI(arm-eabi
)。同じシステムでABIを混在させることはできないため、ABIのパッケージのソースを見つける必要があります(または別のABI用にシステムを再インストールします)。