10

サードパーティから、solaris ステーションでリンクするための静的ライブラリ (.a) が提供されました。sunpro でコンパイルしようとしましたが、リンク段階で失敗しました。

この問題は、私が使用しているコンパイラ (代わりに gcc?) または単にそのバージョン (コンパイラによって提供される std lib がライブラリ AFAIK によって期待されるバージョンから変更される可能性があるため、リンクステップでエラーが発生する可能性があるため) から発生していると思います)。

このライブラリを生成するためにどのコンパイラが使用されたかを知るにはどうすればよいですか? それを行うツールはありますか?sunpro/gcc などのオプションはありますか?

ヒントとして:オブジェクト ファイルを生成するときに、コンパイラがさまざまなマングリング規則を使用することを少し前に読みました (本当ですか?)。それでも、「nm --demangle」コマンド ラインでは、この静的ライブラリのデバッグ シンボルからすべての関数名が出力されます。それはどのように機能しますか?私の仮定が正しければ、nmには静的ライブラリで使用されている規則を解決する方法がありますね。それとも、nm は GNU binutils の一部であるため、lib が GNU gcc によって生成されたことを単に意味しているのでしょうか?

ワークステーションの近くにいないため、リンカーからエラー出力をコピーして貼り付けることはできません (現時点ではありませんが、さらに編集してコピーすることはできます)。

4

4 に答える 4

6

アーカイブからオブジェクト ファイルを抽出し、stringsそれらのいくつかに対してコマンドを実行します (ふるいにかけるノイズが少ないため、最初に小さいファイルに対して実行します)。多くのコンパイラは、オブジェクト ファイルに ASCII 署名を挿入します。

たとえば、次の無意味なソース ファイルfoo.c:

extern void blah();

私のFedora 10マシンでfoo.oにコンパイルするgcc -c -o foo.o foo.cと、647バイトのfoo.oオブジェクトファイルになります。で実行stringsするとfoo.o

GCC: (GNU) 4.3.2 20081105 (レッドハット 4.3.2-7)
.symtab
.strtab
.shstrtab
。文章
。データ
.bss
。コメント
.note.GNUスタック
foo.c

これにより、コンパイラが GCC であることが明らかになりました。でコンパイルしたとしても-fno-ident、.GNU-stack ノートの ELF セクションはまだ存在していました。

arユーティリティを使用するか、Midnight Commander (ar を統合) を使用してオブジェクト ファイルを抽出するか、単純stringsにアーカイブを実行することができます (ノイズが多くなり、関連性が低くなる可能性がありますが、それでも役立ちます)。

于 2009-04-07T23:51:00.337 に答える
4

strings私はプログラムを使用する傾向があり(' -a'オプション、または' -a'の動作が標準である独自のバリアントを使用)、わかりやすい兆候を探します。たとえば、私自身のライブラリの1つで、次のことがわかります。

/work1/gcc/v4.2.3/bin/../lib/gcc/sparc-sun-solaris2.10/4.2.3/include
/work1/gcc/v4.3.0/bin/../lib/gcc/sparc-sun-solaris2.10/4.3.0/include
/work1/gcc/v4.3.1/bin/../lib/gcc/sparc-sun-solaris2.10/4.3.1/include
/work1/gcc/v4.3.3/bin/../lib/gcc/sparc-sun-solaris2.10/4.3.3/include

これは、ライブラリ内のコードが何年にもわたってさまざまなバージョンのGCCでコンパイルされていることを示しています(実際、1つのライブラリで非常に多くのバージョンを見つけて非常に驚いています)。

別のライブラリには次のものが含まれます。

cg: Sun Compiler Common 11 Patch 120760-06 2006/05/26
acomp: Sun C 5.8 Patch 121015-02 2006/03/29
iropt: Sun Compiler Common 11 Patch 120760-06 2006/05/26
/compilers/v11/SUNWspro/prod/bin/cc -O -v -Xa -xarch=v9 ...

したがって、通常、オブジェクトファイルには、使用されたコンパイラを示すフィンガープリントがあります。しかし、あなたはそれらを探す方法を知らなければなりません。

于 2009-04-08T04:31:36.543 に答える
2

ライブラリは C または C++ ライブラリであるはずですか?

C ライブラリの場合、C には名前マングリングがないため、名前マングリングが問題になることはありません。ただし、形式が間違っている可能性があります。Unices にはa.out形式のライブラリがありましたが、新しいバージョンのほとんどはELFのようなより強力な形式に切り替わりました。

C++ ライブラリの場合、名前マングリングが問題になる可能性があります。ほとんどのコンパイラは、コンパイラ固有のシンボルをコードに埋め込んでいるため、シンボルを一覧表示する nm のようなツールがあれば、それがどのコンパイラから来たものかを推測できます。

たとえば、g++ はシンボルを作成します

__gxx_personality_v0

そのライブラリで

于 2009-04-07T23:27:54.790 に答える