web-dev-qa-db-ja.com

有効な実行可能ファイルかどうかをテストします

実行可能ファイルが存在するだけでなく、有効であるかどうかをテストする(比較的)簡単な方法はありますか?

有効とは、x86_64 Mach-O(OS X)実行可能ファイルがARM Raspberry Piで実行されないことを意味します。ただし、_tool-osx || tool-rpi_を実行するだけでOSXで機能します。実行可能ファイルは実行されますが、x86_64に障害が発生しても_tool-rpi_にフォールバックしません。

プロセッサアーキテクチャに対して無効な実行可能ファイルがある場合、どうすれば別の実行可能ファイルにフォールバックできますか?

3
Josh The Geek

有効な実行可能ファイルをテストするのではなく、現在のアーキテクチャが何であるかをテストし、それに基づいて適切な実行可能ファイルを選択するのがおそらく最善です。例えば:

if [ $(uname -m) == 'armv6l' ]; then
    tool-rpi
else
    tool-osx
fi

ただし、実行可能ファイルのテストが本当にやりたいことである場合、GNU fileはわかります実行可能ファイルのアーキテクチャ:

user@Host:~$ file $(whereis cat)
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x4e89fd8f129f0a508afa325b0f0f703fde610971, stripped
6
Outurnate

Linux glibcでは、動的にリンクされた実行可能ファイルが正常に実行されるかどうかをテストするために使用できる1つのハックですが、実際には実行せずに、その環境でLD_DEBUG=helpを設定します。ヘルプメッセージ(無視します)を出力して正常に終了するのは良いことです。無効な場合はエラーが発生します。

残念ながら、これはLinux glibcに固有のものであり、MacOSについて質問しているようです。また、静的にリンクされたバイナリや、setuidまたはsetgidバイナリでは効果がありません。

2
Celada