web-dev-qa-db-ja.com

Linuxでは、.aライブラリ/アーカイブが32ビットか64ビットかを判断しますか?

Linuxでは、64ビット版と32ビット版の両方で静的ライブラリを配布しています。顧客のトラブルシューティングを行うとき、診断シェルスクリプトで.aアーカイブファイルをチェックして、32ビットか64ビットかを判断することにより、問題を迅速に解消したいと思います。私に起こる方法はエレガントではありません:

  1. .oメンバーを抽出し、「file」コマンドを要求します(例:ELF 32ビットなど)

  2. を示すためにコード化されたダミーメンバーを含めます。 32bit.o/64bit.oおよび「ar -t」を使用して確認

「strings xyz.a | grep 32」を試しましたが、これはバージョン間ではうまく機能しません。悲痛な問題ではありませんが、エレガントなソリューションを知っているなら、私は知りたいです。

76
cvsdave

objdumpは最良の方法のようです:

objdump -f libfoo.a | grep ^architecture
108
caf

最も簡単な方法は、fileコマンドを使用することです。

$file <.so file or .a file>
27
pankaj kapoor

Fileコマンドを使用するだけです。つまりfile library.so

16
Erik

おっと、欠落している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'

動作の仕組み:

  • nm-ライブラリからシンボルを取得
  • grep-16進文字列(ファイル内のシンボルのアドレス)で始まる行を取得する
  • head-最初の行を取得
  • sed-空白を含む、空白を超えるすべてを削除します
  • wc-文字数をカウントします。

32ビット環境では、8桁の16進数で構成されるアドレスを取得し、新しい行を追加すると9、64ビット環境では、16桁の16進数で構成されるアドレスを取得し、新しい行を追加すると17

2
Petesh

特定のバージョンに固有の関数がある場合は、nmを試してからその関数のgrepを実行できます。

1
ColWhi