1

Mach-O バイナリの DATA セグメントには、objective-C 固有のセクションがいくつかあります ( Mach-O ファイル形式の 7 ページに記載されています) 。

PiOSの論文を引用するには:

__objc_classlist セクションには、分析されたバイナリに実装が存在するすべてのクラス (つまり、開発者によって実装された、または静的リンカーによって含まれたすべてのクラス) のリストが含まれます。

一方、__objc_classref セクションには、アプリケーションで使用されるすべてのクラスへの参照が含まれています。これらのクラスの実装は、バイナリ自体に含まれている必要はありませんが、ランタイム フレームワーク (動的にリンクされたライブラリに相当) によって提供される場合があります。

これらの構造のレイアウトは、Objective C ランタイム ヘッダー (ここで入手可能) から入手できると述べています。

__objc_classrefおよび__objc_classlistセクションの実際の構造は何ですか?

前もって感謝します。

4

1 に答える 1

3

Objective-C ランタイム実装の少し新しいバージョンのGETSECTマクロの定義を見てください。次のようになります。

#define GETSECT(name, type, sectname)                                   \
    type *name(const header_info *hi, size_t *outCount)  \
    {                                                                   \
        unsigned long byteCount = 0;                                    \
        type *data = (type *)                                           \
            getsectiondata(hi->mhdr, SEG_DATA, sectname, &byteCount);   \
        *outCount = byteCount / sizeof(type);                           \
        return data;                                                    \
    }

これは、各セクションが type の項目の配列であることを示していますtype

_getObjc2ClassRefs数行後に、必要な 2 つのセクションを読み取るおよびという名前の関数を宣言するために使用され_getObjc2ClassListます。

GETSECT(_getObjc2ClassRefs,           class_t *,       "__objc_classrefs");
GETSECT(_getObjc2ClassList,           classref_t,       "__objc_classlist");

だからs を__objc_classrefs含み、s を含む。これらのフィールドの解釈は、比較的自明です。class_t *__objc_classlistclassref_t

于 2013-03-23T06:51:39.113 に答える