共有オブジェクトのトラブルシューティング
このセクションでは、発生する可能性のある問題とそれの解決策を説明します。
共有オブジェクトにシンボルがない
生成された共有オブジェクトにシンボルが存在しません(エラーLi068)。
これを解決するには、共有オブジェクトからシンボルをエクスポートしなければなりません。シンボルは、-so_exportオプションまたはso_exportディレクティブを使ってエクスポートされます。‑‑so_exportおよびso_export ディレクティブを参照してください。
共有オブジェクトにシンボルが見つからない
共有オブジェクトに存在すべきシンボルが含まれていません。共有オブジェクト内のコンテンツによってエクスポートも参照もされていないシンボルは、ILINKリンカーによって破棄されます。
これを解決するには、シンボルをエクスポート、キープ、または#pragma requiredディレクティブを使用して、強制的に含めることができます。共有オブジェクトには、エクスポートされないシンボルを含めることができることに注意してください。どのシンボルがインポートまたはエクスポートされるかを確認するには、ielfdumparm を使用して、セクション .dynsym(動的リンカによってアクセスされるセクション)のコンテンツのリスト(ダンプ)を生成できます。共有オブジェクト内のすべてのシンボルを表示するには、セクション.symtab(ターゲットには転送されません)をダンプします。
‑‑so_export、so_export ディレクティブ、‑‑keep、keep ディレクティブ、required、およびIAR ELF Dumper — ielfdumpを参照してください。
共有オブジェクトでシンボルが定義されていない
エラーLi066が生成され、共有オブジェクトで定義されていないシンボルのリストが表示されます。
デフォルトでは、共有オブジェクトに定義されていないシンボルへの参照が含まれている場合、リンカがこのエラーを生成します。--so_importオプションまたはso_importリンカディレクティブを使用して、指定したシンボルを許可します。これらのシンボルは、共有オブジェクト内で外部として宣言されます。so_import *;を指定すると、すべての未定義シンボルを許可することもできます(*ワイルドカードに注意)。
別のオプションは、--diag_suppressまたは--diag_warningオプションを使用して、エラーを抑制するか、警告を低減します。
‑‑so_importおよびso_import ディレクティブを参照してください。
シンボルの定義、インポートとしての宣言の両方がされている
エラーLi067が生成され、共有オブジェクト内で定義され、かつインポートとして宣言されているシンボルのリストが表示されます。
共有オブジェクトでは、同じシンボルのインポートと定義の両方を行うことはできません。定義が間違って含まれてしまったか、最新でないso_importディレクティブを使用している可能性があります。
非公開シンボルがエクスポートされた
ワーニングLi069が生成され、visibility属性がhiddenに設定されエクスポートされたシンボルに名前が付けられます。問題は、コードが共有オブジェクトの外部から呼び出されないという想定のもとで生成されたことです。非公開のシンボルがエクスポートされると、その関数は「誰でも」呼び出すことができてしまいます。
これは問題というわけではありませんが、警告が生成され、潜在的に安全でないことをアラートします。--diag_suppressオプションで警告を抑制するか、シンボルのvisibilityをinterposableまたはprotectedに変更してコードを再コンパイルする必要があります。
‑‑visibilityを参照してください。
.dynsymのローカルシンボルは、動的リンカの問題の原因になる
.dynsymセクションにローカルシンボルがある場合、動的リンカはそれを無視するか、診断メッセージを発行します。
リンカは、エクスポートされないシンボルをローカルシンボルとして.dynsymセクションに出力します。一部の動的リンカはこれを処理できません。シンボルを機能させるにはエクスポートする必要があります。--so_exportオプションまたはso_exportディレクティブを使用してこれらのシンボルをエクスポートするか、so_export *;を指定することで、共有オブジェクト内に含まれるすべてのパブリックシンボルをエクスポートします(*はワイルドカードです)。
‑‑so_exportおよびso_export ディレクティブを参照してください。