2008-09-17 13 views
3

なぜLeopardは$ non_lazy_ptrでいくつかのシンボルをマングルするのですか?もっと重要なのは、シンボルが$ non_lazy_ptrでマングルされているため、未定義のシンボルエラーを修正する最良の方法は何ですか?

答えて

5

より:Developer Connection - Indirect Addressing

間接アドレッシングは、ファイルのレイアウトの明示的な知識を持っている参照ファイルを必要とせず、一つのファイルで定義されたシンボルは、他のファイルから参照されることを可能にするコード生成技術の名前でありますそれはシンボルを定義します。したがって、定義ファイルは参照ファイルとは独立して変更することができます。間接アドレッシングは、ダイナミックリンカによって変更する必要がある場所の数を最小限に抑え、コード共有を容易にし、パフォーマンスを向上させます。

ファイルが別のファイルで定義されたデータを使用する場合、シンボル参照が作成されます。シンボル参照は、シンボルがインポートされるファイルと参照シンボルを識別します。記号の参照には、非遅延と遅延の2種類があります。

非遅延シンボル参照は、モジュールがロードされたときにダイナミックリンカによって解決されます(定義にバインドされています)。 非遅延シンボル参照は基本的にシンボルポインタで、ポインタサイズのデータ​​です。コンパイラは、データシンボルまたは関数アドレス用の非遅延シンボル参照を生成します。

レイジーシンボル参照は、動的リンカによって最初に使用されたとき(ロード時ではなく)に解決されます。後続の参照シンボルの呼び出しは、シンボルの定義に直接ジャンプします。 遅延シンボル参照は、シンボルポインタとシンボルスタブで構成されます。シンボルスタブは、シンボルポインタを直接参照してジャンプする少量のコードです。コンパイラは、別のファイルで定義された関数への呼び出しを検出すると、遅延シンボル参照を生成します。

3

human-speak:コンパイラは、$ non_lazy_ptrにスタブを追加して、リンクを高速化します。 _Foo $ non_lazy_ptrから参照される関数Fooが定義されていない、あるいはそのようなものがあります。これらは同じものではありません。シンボルが実際に宣言され、アプリケーションをリンクしているオブジェクトファイル/ライブラリにエクスポートされていることを確認してください。少なくともそれは私の問題でした。問題が別の場所にあることが判明するまでは変わったリンカーだと思っていました。Googleには他にもいくつかの原因が考えられます。

0

RANLIB -cライブラリファイルに他の誰かが私が持っていた同じ問題をつまずく場合は、問題

1

が修正されています。

は、ヘッダファイル内extern NSString* const someString;を持っていたが、それを実装ファイルを置くのを忘れていました。 as NSString* const [email protected]"someString";

これを解決しました。

2
ranlib -c libwhatever.a 

は、この問題の解決策です。 iOS用のPJSIPライブラリを構築するときも同じ問題がありました。このライブラリsort-ofは、autoconfベースのmakeシステムを使用しますが、iOSのためにすべてのものを整えるために、さまざまなファイルを少し微調整する必要があります。それを行う過程で、ライブラリのルールでranlib行を削除してから、_PJ_NO_MEMORY_EXCEPTION$non_lazy_ptrから参照される_PJ_NO_MEMORY_EXCEPTIONについてのプロジェクトのリンクにエラーが発生し始めました。

ライブラリファイルにranlib行を戻して解決しました。今ルールにLIBSの完全なエントリ。MAKは、iPhoneまたはiOSで外部ライブラリを構成し、一般的なUNIXを使用しようとして

$(LIB): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP) 
    if test ! -d $(LIBDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR)); fi 
    $(LIBTOOL) -o $(LIB) $(OBJS) 
    $(RANLIB) -c $(LIB) 

希望これは、同様に他の人を助けています。

関連する問題