私はしばらく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
…
これが何を意味するのかよくわかりませんが、文書ははいそこですか?それとも共有ライブラリに関連していますか?
ベストアンサー1
「ローダー」に依存するファイルを実行できない場合、受信したエラーは実行中のファイルではなくローダーと関連がある可能性があります。
- 動的にリンクされたデフォルトの実行可能ファイルのローダーは、動的ライブラリーのロードを担当するシステムの一部です。これは
/lib/ld.so
実行可能ファイルに似ており、実行可能ファイルで/lib/ld-linux.so.2
なければなりません。 /bin/sh
スクリプトのローダーは、で始まるスクリプトなど、shebang行に記載されているプログラムです#!/bin/sh
。
エラーメッセージは誤解を招き、ローダーに問題があることを示していません。残念ながら、カーネルインターフェイスには数値エラーコードを報告するスペースしかありませんが、エラーが実際に他のファイルに関連付けられていることを示すスペースがないため、この問題を解決するのは困難です。一部のシェルはスクリプト自体に対してこれを行いますが(#!
スクリプトの行を読み取り、エラー条件を再評価します)、ネイティブバイナリに対して同じことをしたいシェルは見たことがありません。
ldd
また、いくつかの特別な環境変数を設定してからプログラムを実行し、ローダーにアクションを実行させることで機能するため、バイナリでは機能しません。strace
また、カーネルが報告する以上を報告しないため、意味のある情報も提供しません。そして私たちが見たように、カーネルは知っているすべてを報告することはできません。
ここで再インストールしたい実行可能ファイル(smbd
、transmission-daemon
など)がシステムに存在しないローダーを要求しています。したがって、新しいフィードもシステムに適していません。
これは通常、正しいシステム(またはシステムスイート)とスーパーアーキテクチャに対してバイナリを実行しようとしていますが、無効なサブアーキテクチャに対して実行しようとしたときに発生します。これにはそれを必要とするシステムにELFバイナリがあるため、カーネルはそれを正しくロードできます。これはARMプロセッサで実行されるARMバイナリなので、これらの命令は意味があり、プログラムがそのローダを見つけることができます。しかし、これは間違ったローダーです。
これで推測し始めましたが、新しいフィードが間違ったARMのようです。ABI。 ABIは、プロシージャ間呼び出し、特にライブラリ関数呼び出しのための汎用言語です。一部のプロセッサアーキテクチャでは、いくつかのABI選択が可能であり、1つを選択して一貫して使用する必要があります。現在、Linuxディストリビューションには2つのARM ABIがあります。既存のarm-elf
ABI、そして最新えび( arm-eabi
)。同じシステムでABIを混在させることはできないため、ABIのパッケージソースを見つける必要があります(または別のABI用にシステムを再インストールする必要があります)。