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


87

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

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

  2. 32bit.o / 64bit.oなどを示すようにコード化されたダミーメンバーの組み込みを開始し、「ar-t」を使用してチェックします

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


私はstackoverflow.com/questions/184502/…について知っています。より良い解決策を探しています。
cvsdave 2011

2
他の質問の解決策は問題に非常にうまく対処しているようですが、簡単な方法はnm foo.a |です。grep '^ 0' | ヘッド-1 | wc -c-結果が17(16 + 1 == 8バイト+行リターンの場合は1文字)の場合は64ビット、9の場合は32ビット(8 + 1 == 4バイト+行リターンの場合は1文字)
Petesh

14を取得した場合はどうなりますか?o_0
アルモ

回答:


123

objdump 最善の方法のようです:

objdump -f libfoo.a | grep ^architecture

1
file下に述べたように読みやすいstackoverflow.com/a/8909086/233906
Cerber

1
私はarchitecture: i386:x86-64, flags 0x00000039:..それはそれが両方であるという意味ですか..?それはありそうもない。助けてください:D
グレイウルフ2016年

10
@Paladin:それは64ビットです-x86アーキテクチャはobjdumpによってi386(プレーンな古いIA32)、i386:x86-64(AMD64)、およびi386:x64-32(X32 32ビットアドレス空間のロングモードアーキテクチャ)として記述されています。
caf 2016年

1
'objdump'のフラグ '-f'は、ライブラリ 'libfoo.a'のファイルヘッダー全体の内容を表示することを指定します。次に、「objdump」からのこの出力は、「architecture」という単語を検索するgrepコマンドにパイプされます。文字「^」は、「アーキテクチャ」が行を開始する必要があることを意味します。
ルークパーネル2018

3
それをクリーンアップし、dupesを削除します。objdump -f lib.a | grep ^architecture | cut -d' ' -f-2 | sort -u:)
legends2k

33

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

$file <.so file or .a file>

31
msys環境では、これは単に<file>をエコーします:ターゲットアーキテクチャではなく、現在のarアーカイブ
スコーン2013

11
同様に、私の現在のLinux(Ubuntu)環境でも。
アシェラ2014

4
同様にcentos7中
ハイムGeretz

Ubuntu16.04では正常に動作します。(1)file armeabi/libpique.so-> libpique.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped。(2)file x86/libpique.so->libpique.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
rpattabi 2016

5
.soファイルと.aファイルは同じものではありません。これが共有ライブラリで機能することを示すことは、静的ライブラリで機能することを示すことと同じではありません。元の質問は静的ライブラリ(.aファイル)に関するものです。私の場合(MSYSを使用)、cafによって投稿されたobjdumpソリューションは、ファイルを使用すると、スコーンが取得するのと同じように「ararchive」を出力する場合に機能します。
ショーンバートン

17

fileコマンドを使用するだけです。すなわちfile library.so


質問は特に静的ライブラリに関するものです。
pooya13

3

おっと、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進文字列(ファイル内のシンボルのアドレス)で始まる行を取得します
  • 頭-最初の行を取得します
  • sed-空白を含む空白を超えるすべてのものを削除します
  • wc-文字数を数えます。

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


1
そこにsed
e's/。*//

ちなみに73個もらえます。なぜそれが機能するのか説明してください。
Francesco Dondi 2017

おっと、その行方不明のsedは重要でした。回答が更新され、それがどのように機能するかについての説明が追加されました
Petesh 2017

1

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


ライブラリ内の特定のバイトを検索するコードを記述できる場合があります。両方のファイルでodを使用して、2つのファイルの違いを見つけてみてください。
ColWhi 2011

1
別の解決策は、ライブラリの名前を変更することです。
ColWhi 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.