0

私は一般的なシナリオを持っています: いくつかの標準ライブラリといくつかのユーザー ライブラリに依存する実行可能ファイルのいくつかのソース ファイル。すべてのユーザー ライブラリは実行可能ファイルに静的にリンクされますが、標準ライブラリは動的にリンクされます。

問題: 完全なパッケージ (既にユーザー ライブラリ コード + 共有標準ライブラリを含む実行可能ファイル) に複数のシンボルが定義されていると思います。リンカーは明らかにそれに対する洞察を持っていますが、私が理解しているように、リンカーは複数の強い名前のシンボルに遭遇しない限り文句を言いません。コードを solaris 8/sparc プラットフォームから solaris10/sparc プラットフォームに移行しているときに、いくつかの標準の UNIX 関数がユーザー ライブラリに実装されているため、実行時にアプリがクラッシュするのではないかと心配しています。アプリケーションは、solaris 8/sparc プラットフォームで正常に動作することに注意してください。

私は奇妙な問題に直面しており、これが原因である可能性があると信じるようになりました

  1. あるライブラリの 1 つの変数を変更すると、別のライブラリの別の変数の値が変更されます
  2. Solaris 8-10: host2ip 変換の問題

必要なもの:

  1. 複数定義されたすべてのシンボルを簡単にリストする方法はありますか?
  2. ユーザー ライブラリに由来する複数定義されたすべてのシンボルを簡単に一覧表示する方法はありますか?
  3. 問題 #1 はリンクの問題が原因であると思いますか、それとも他の問題の兆候であると思いますか?

Edit1:それ以来、ldを使用してマップファイルを生成すると、標準ライブラリ呼び出しのように見える名前を見つけるために、複数定義されたシンボルのセクションがあることがわかりました。知らない人のために説明すると、リンカーは、同じ名前の複数のシンボルが見つかり、名前が厳密な名前である場合にのみリンクに失敗します。

4

2 に答える 2

0

コンパイラ(実際にはリンカ)の設定でMAPファイルの生成をオンにし、マップファイルを調べて、問題のUNIXシステム機能に一致するシンボルを探すことができます。おそらくそれを自動化するためのスクリプトを書かなければならないでしょうが、これは良い出発点になるでしょう。コマンドラインスイッチはおそらく-mapまたは同様のものであり、使用しているコンパイラ/リンカーによって異なります。

于 2012-09-18T21:47:39.033 に答える
0

起こっていた実際の問題は次のとおりです。ライブラリ(これをlib1と呼びましょう)には次のような配列がありました

#define ARRAY_SIZE 1024
SomeStruct* global_array[ARRAY_SIZE];

この配列は、別のライブラリ(lib2と呼びましょう)によって使用されます。このライブラリは、アプリケーションがextern宣言を使用して使用します。

lib2をコンパイルしている間(またはアプリがわからない場合)、ARRAY_SIZEをまったく定義しませんでした。これにより、lib2(またはアプリ)のコンパイラがglobal_arrayのサイズを誤って計算し、global_arrayにすでに割り当てられている場所にある他の変数にメモリを割り当てました。

ライブラリとアプリのコンパイル中にARRAY_SIZEを再度定義すると、すべてが正常に動作し始めます。配列のextern宣言にサイズが含まれていないため、問題の原因と解決される理由を完全には理解していません。また、ライブラリが実際にMACRO ARRAY_SIZEを使用している場合、コンパイルが失敗しないのはなぜですか?また、定義に使用される名前が標準名である可能性があります(実際の文字列はFD_SETSIZEでした)

リンカーについての私の最初の腸の感覚は間違っていました。

于 2012-09-24T15:51:50.560 に答える