私は最近、iOS SDK4.3nm -m -p -g
のSystem.B.dylib
ライブラリを実行しましたが、多くのシンボルがマークされていることに驚きました(undefined) (external)
。未定義のシンボルが外部としてマークされるのはなぜですか? lazy
orとマークされた未定義の外部シンボルは理解できますweak
が、そうではありません。関数の多くは、pthread_xxx
このカテゴリに分類されます。ただし、このライブラリとリンクすると、すべてのシンボルが解決されます。pthread_xxx
シンボルはフォルダー内のライブラリの 1 つに定義されているので\usr\lib\system
、そこから満足していると思います。リンク中にどのように機能しますか?
質問する
1156 次
2 に答える
2
私がCコーディングの忍者だったnm
のは久しぶりですがld
、これは、これがリンクしている他のライブラリがあることを意味しているだけだと思います。
于 2011-09-21T16:46:36.840 に答える
0
通常、これが動的リンクの仕組みです。System.B の静的アーカイブを nm に記録した場合、この動作は観察されませんでした。System.B.dylib だけではあまり効果がありません。関数を利用する動的および静的ライブラリのアンサンブルセットの一部としてそれを作成しない限り。最終的なバイナリをコンパイルしようとして、ライブラリ パス '/usr/lib/system' を省略した場合、リンカはファウルを叫び、 pthread_XXX() への参照が見つからないことを示すエラーで終了します (上記の例を使用) )。バイナリの最終的なアセンブル中に、使用されるすべての関数の場所を確実に把握する必要があります。
HTH
于 2011-09-21T17:28:24.783 に答える