2017-12-04 9 views
0

私はオプションの私の理解を与えることから始めます:extern-onlyオプションとdefined-onlyオプションのnmツール出力が重複するのはなぜですか?

  1. にextern専用:私バイナリによって参照されているシンボルのみを表示しますが、その定義(コードまたは変数)、別のバイナリで提供されます
  2. 定義のみ:定義がバイナリに含まれるシンボルのみを表示します。ここで

私のコマンドとその出力されます。

$nm -defined-only GenerationOfNow | grep FIRAZeroingWeakContainer 
000000010002c128 t -[FIRAZeroingWeakContainer .cxx_destruct] 
000000010002c0fb t -[FIRAZeroingWeakContainer object] 
000000010002c114 t -[FIRAZeroingWeakContainer setObject:] 
000000010021a218 S _OBJC_CLASS_$_FIRAZeroingWeakContainer 
00000001002177f8 s _OBJC_IVAR_$_FIRAZeroingWeakContainer._object 
000000010021a1f0 S _OBJC_METACLASS_$_FIRAZeroingWeakContainer 

$nm -extern-only GenerationOfNow | grep FIRAZeroingWeakContainer 
000000010021a218 S _OBJC_CLASS_$_FIRAZeroingWeakContainer 
000000010021a1f0 S _OBJC_METACLASS_$_FIRAZeroingWeakContainer 

あなたが見ることができるように、-externのみの出力が-defined専用出力のサブセットです。どうして?おそらく私の質問は:2番目の列にSが付いているアイテムの意味は?

答えて

2

-extern-only-undefined-onlyと混同しています。

はここで混合されている2つの概念があります。

  • にextern対
  • が未定義対定義されたローカル(C externstaticで、「ローカル」は時々、「プライベート」と呼ばれています)

後者は、その原点について説明しているが、前者は、シンボルの可用性を記述する。そして、はい、プライベート未定義のシンボルのも、概念はman nmごとに、存在する:

各シンボル名は、その値が先行する(ブランクが定義されていない場合)。 [...]動的共有ライブラリの小文字のuは、同じライブラリ内の別のモジュールのプライベート外部への未定義の参照を示します。 -undefined-onlyを使用した場合

さて、あなたは実際に-undefined-only

bash$ nm test.dylib 
0000000000000f60 T _derp 
0000000000000f70 t _herp 
       U _printf 
       U dyld_stub_binder 
bash$ nm -defined-only test.dylib 
0000000000000f60 T _derp 
0000000000000f70 t _herp 
bash$ nm -undefined-only test.dylib 
_printf 
dyld_stub_binder 
bash$ nm -extern-only test.dylib 
0000000000000f60 T _derp 
       U _printf 
       U dyld_stub_binder 

-extern-onlyの補数は、しかし補完的な旗を持っていないようだのですか。

関連する問題