Как загрузчик Mach-O загружает разные объекты NSString? - PullRequest
4 голосов
/ 22 мая 2010

Я знал, что если вы определите кучу @ "" NSString объектов в исходном коде в Mac OS. Эти строки NSS будут храниться в сегменте в библиотеке 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 в качестве разделителя. Я хочу знать, как загрузчик в Mac OS X загружает эти строки NSS при запуске программы? Они загружаются просто, распознав разделитель 0x0000, или это таблица смещения строк в другом месте двоичного файла, указывающая на отдельные объекты NSString? Спасибо.

(Что я действительно хочу сделать, так это увеличить длину одной строки NSSt, поэтому я должен знать, как загрузчик распознает эти отдельные объекты)

добавлено: Я знаю, что если вы определите CString как @ "abc" в коде, он перейдет в сегмент cstring. Если это строка типа @ "" "" с символами ascii, она переходит в раздел ustring согласно моему копанию.

Ответы [ 2 ]

5 голосов
/ 22 мая 2010

Существует секция cstring со всеми константами C-строк. Каждая константа NSString просто ссылается на одну из этих строк C. Структура C для константы NSString выглядит следующим образом:

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

Загляните в раздел __DATA __cfstring.

Edit:

Сегмент __ustring является эквивалентом сегмента __cstring, за исключением строк UTF16. Таким образом, константа NSString может относиться либо к данным ustring, либо к cstring.

Единственная ссылка на данные ustring, вероятно, из строки cfstring, которой они используются. Если вы удлините одну строку, cfstring, ссылающаяся на следующую строку, вместо этого будет ссылаться на хвост удлиненной строки, если вы не исправите ее. Вы можете найти свободное место в другом месте, куда вы можете указать строку cfstring.

2 голосов
/ 22 мая 2010

Нет. Каждая строка имеет адрес в двоичном файле. Если вы вставите символ в одну строку, адрес будет увеличиваться по сравнению со всеми теми, что находятся над ним, и вам нужно будет настроить их адреса там, где они упоминаются в двоичном файле, плюс, если вы сделаете сегмент больше, вам, возможно, потребуется отрегулировать расположение любых последующих сегментов в зависимости от того, сколько было упаковки для выравнивания сегмента. Гораздо проще просто перекомпилировать программу и позволить компоновщику позаботиться об этом.

Примечание: строки NSS не хранятся внутри как последовательности символов C. Это деталь реализации, но я подозреваю, что NSStrings используют 16-битную ширину символа.

...