Linuxでは、64ビット版と32ビット版の両方で静的ライブラリを配布しています。顧客のトラブルシューティングを行うとき、診断シェルスクリプトで.aアーカイブファイルをチェックして、32ビットか64ビットかを判断することにより、問題を迅速に解消したいと思います。私に起こる方法はエレガントではありません:
.oメンバーを抽出し、「file」コマンドを要求します(例:ELF 32ビットなど)
を示すためにコード化されたダミーメンバーを含めます。 32bit.o/64bit.oおよび「ar -t」を使用して確認
「strings xyz.a | grep 32」を試しましたが、これはバージョン間ではうまく機能しません。悲痛な問題ではありませんが、エレガントなソリューションを知っているなら、私は知りたいです。
objdump
は最良の方法のようです:
objdump -f libfoo.a | grep ^architecture
最も簡単な方法は、fileコマンドを使用することです。
$file <.so file or .a file>
Fileコマンドを使用するだけです。つまりfile library.so
おっと、欠落しているsedは、多くのアイテムに表示されていたことを意味します。
ちょうど答えで:
count=$(nm foo.a | grep '^0' | head -1 | sed 's/ .*//' | wc -c)
((count == 17)) && echo 64bit
((count == 9)) && echo 32bit
((count == 0)) && echo '??bit'
動作の仕組み:
32ビット環境では、8桁の16進数で構成されるアドレスを取得し、新しい行を追加すると9
、64ビット環境では、16桁の16進数で構成されるアドレスを取得し、新しい行を追加すると17
。
特定のバージョンに固有の関数がある場合は、nmを試してからその関数のgrepを実行できます。