4

MacOSのソースコードで@""NSStringオブジェクトの束を定義する場合は知っています。これらのNSStringは、Mach-Oライブラリのセグメントに格納されます。

Section
sectname __ustring
 segname __TEXT
    addr 0x000b3b54
    size 0x000001b7
  offset 731988
   align 2^1 (2)
  reloff 0
  nreloc 0
   flags 0x00000000
reserved1 0
reserved2 0

0x0000バイナリを16進ダンプすると、セパレータとして1つずつ密接に配置されます。私が知りたいのは、プログラムの実行時にMac OSXのローダーがこれらのNSStringをどのようにロードするかです。それらはセパレーターを認識することによって単純にロードされ0x0000ますか、それともこれらは別々のNSStringオブジェクトを指すバイナリの他の場所にある文字列オフセットテーブルですか?ありがとう。

(私が本当にやりたいのは、NSStringの1つの長さを増やすことです。したがって、ローダーがこれらの個別のオブジェクトをどのように認識するかを知る必要があります)

追加:コードで@ "abc"のようなCStringを定義すると、cstringセグメントに移動します。@ "" ""のようにASCII文字が含まれていない文字列の場合、私の掘り下げに従ってustringセクションに移動します。

4

2 に答える 2

5

すべての定数C文字列を含むcstringセクションがあります。各定数NSStringは、これらのC文字列の1つを参照するだけです。定数NSStringのC構造体は、次のようになります。

struct NSConstantString {
  Class isa;
  char *bytes;
  int numBytes;
};

セクションを見てください__DATA __cfstring

編集:

__ustringセグメントは、UTF16文字列を除いて、__cstringセグメントと同等です。したがって、定数NSStringは、ustringまたはcstringデータのいずれかを参照できます。

ustringデータへの唯一の参照は、おそらくそれが使用されているcfstringからのものです。1つの文字列を長くすると、修正しない限り、次の文字列を参照するcfstringは、代わりに長くなった文字列の末尾を参照します。cfstringをポイントできる他の場所に空き領域を見つけることができる場合があります。

于 2010-05-22T16:27:11.930 に答える
2

いいえ。各文字列には、バイナリにアドレスがあります。1つの文字列に文字を挿入すると、その上にあるすべての文字のアドレスが増加し、バイナリで参照されている場所でアドレスを調整する必要があります。さらに、セグメントを大きくする場合は、必要になる可能性があります。セグメントの位置合わせのためにあったパッキングの量に応じて、後続のセグメントの位置を調整します。プログラムを再コンパイルしてリンカに処理させる方がはるかに簡単です。

NB NSStringは、C文字のシーケンスとして内部に格納されません。これは実装の詳細ですが、NSStringは16ビットの文字幅を使用していると思います。

于 2010-05-22T16:32:24.077 に答える