
これNASMドキュメントから「elf
グローバル方向の拡大」説明する、
シンボルの ELF 可視性を制御することも選択できます。可視性キーワードの1つを追加するだけです:
default
、、または。もちろんデフォルトです。internal
hidden
protected
default
これらはどこで定義されていますか?そしてどのようにld
使用しますか?わかりますC++でよく言及されるアクセスレベルは次のとおりです。保護される、人々と プライベートところで、ELFがこれを言及しているかどうかはわかりません。
マイユースケースはCとアセンブリなので、それを言語とリンカーの両方に関連付けることができる場合はボーナスポイントです。
答え1
そうだNASMソースこれは文書と一致するようです信託リンカーおよびライブラリーガイド、これは、、、STV_DEFAULT
にSTV_INTERNAL
対応STV_HIDDEN
するようですSTV_PROTECTED
。
Oracleはこう述べています。
STV_DEFAULT
この属性を持つシンボルの可視性は、STV_DEFAULT
シンボルのバインディングの種類によって指定されます。言い換えれば、グローバルシンボルと弱いシンボルは、定義コンポーネント、実行可能ファイル、または共有オブジェクトの外側で見ることができます。地域のシンボルは隠されています。グローバルシンボルと弱いシンボルもプリエンプションできます。つまり、異なるコンポーネントに同じ名前の定義を介して挿入できます。
STV_PROTECTED
現在のコンポーネントで定義されているシンボルは、他のコンポーネントに表示されますが、プリエンプションできない場合は保護されます。定義コンポーネント内のこれらのシンボルへのすべての参照は、基本ルールによって挿入された定義が他のコンポーネントに存在する場合でも、そのコンポーネントの定義として解釈されるべきです。バインディングのあるシンボルは表示されSTB_LOCAL
ませんSTV_PROTECTED
。
STV_HIDDEN
現在のコンポーネントで定義されているシンボルの名前が他のコンポーネントに表示されない場合、そのシンボルは非表示になります。これらの記号は保護する必要があります。このプロパティは、コンポーネントの外部インターフェイスを制御するために使用されます。これらのシンボルで指定されたオブジェクトは、そのアドレスが外部に渡される場合は、他のコンポーネントによって引き続き参照できます。
STB_LOCAL
再配置可能オブジェクトが実行可能オブジェクトまたは共有オブジェクトに含まれている場合、リンクエディタは再配置可能オブジェクトに含まれる隠しシンボルを削除またはバインディングに変換します。
STV_INTERNAL
この可視性属性は現在予約されています。
C と Assembly への影響は次のとおりです。オラクルの文書は続けて言います。
リンク編集中、可視性プロパティは実行可能ファイルや共有ライブラリのシンボリック解像度には影響しません。この回避策はバインディングの種類に応じて制御されます。リンクエディタが解像度を選択すると、これらのプロパティには2つの要件が適用されます。両方の要件は、リンクされたコードの参照が属性を利用するように最適化されている可能性があるという事実に基づいています。
第1に、シンボル参照に適用される場合、基本以外のすべての可視性属性は、参照を満たす定義を現在実行可能オブジェクトまたは共有オブジェクトに提供する必要があることを意味する。このタイプのシンボル参照がリンクコンポーネント内で定義されていない場合、参照にはバインディングが含まれており、
STB_WEAK
ゼロとして検証する必要があります。第二に、名前への参照または定義がデフォルト以外の可視性プロパティを持つシンボルである場合、可視性プロパティは、関連付けられたオブジェクトの識別されたシンボルに伝播する必要があります。シンボルのさまざまな参照または定義にさまざまな可視性プロパティが指定されている場合は、最もバインドされた可視性プロパティを関連付けられたオブジェクトの識別されたシンボルに伝播する必要があります。属性は、
STV_PROTECTED
などSTV_HIDDEN
の最小の制約から最大の制約まで順に並べ替えられますSTV_INTERNAL
。
また、見ることができます