【问题标题】:How does Mach-O loader loads different NSString objects?Mach-O loader 如何加载不同的 NSString 对象?
【发布时间】:2010-05-22 15:58:11
【问题描述】:

我知道如果你在 Mac OS 的源代码中定义了一堆 @"" 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作为分隔符一一紧密对齐。 我想知道的是Mac OS X中的加载器在程序运行时如何加载这些NSStrings?它们是通过识别0x0000 分隔符来简单加载,还是这些是二进制文件中其他地方的字符串偏移表,指向单独的 NSString 对象? 谢谢。

(我真正想做的是增加其中一个NSString的长度,所以我必须知道加载器如何识别这些单独的对象)

补充说: 我知道如果你在代码中定义像 @"abc" 这样的 CStrings,它将进入 cstring 段。 如果它是像@““””这样的字符串,并且没有ASCII字符,根据我的挖掘,它将进入ustring部分。

【问题讨论】:

    标签: objective-c macos loader mach-o


    【解决方案1】:

    有一个包含所有常量 C 字符串的 cstring 部分。每个常量 NSString 只引用这些 C 字符串之一。常量 NSString 的 C 结构体如下所示:

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

    查看__DATA __cfstring 部分。

    编辑:

    __ustring 段等效于 __cstring 段,但 UTF16 字符串除外。所以一个常量 NSString 可以引用 ustring 或 cstring 数据。

    对 ustring 数据的唯一引用可能来自它所使用的 cfstring。如果你加长一个字符串,引用下一个字符串的 cfstring 将改为引用加长字符串的尾部,除非你修复它。您也许可以在其他地方找到一些可用空间,您可以将 cfstring 指向。

    【讨论】:

    • 有什么方法可以解释__cfstring?
    • __cfstring 基本上是一个 NSConstantString 数组。每个人的 isa 值都相同。之后是指向字符数据的指针,后跟长度。我不确定 ustring 的长度是字节还是字符。
    • 在我的示例中,我可以看到指向字符数据的指针在 0x1000 处关闭,是否总是如此? p.s.最后一件事我不明白,为你点赞!
    • 在otool转储中,它是addr(目标内存地址)和偏移量(来自文件中的mach-o头)之间的差异,对于可执行文件,通常为0x1000。
    【解决方案2】:

    没有。每个字符串都有一个二进制地址。如果你在一个字符串中插入一个字符,地址将增加它上面的所有字符,你需要调整它们在二进制文件中引用的地址,另外,如果你使段更大,你可能需要根据用于对齐段的填充量来调整任何后续段的位置。重新编译程序并让链接器处理它要容易得多。

    NB NSStrings 不会在内部存储为 C 字符序列。这是一个实现细节,但我怀疑 NSStrings 使用 16 位字符宽度。

    【讨论】:

    • 你能指出字符串的地址在二进制文件中的位置吗?这有点难以解释,但目前我无法访问源代码,我正在考虑减去我想要编辑的前一个字符串的长度,如果我能找到,将地址重新指向我的目标字符串 +1参考。是的,ustring 段中的字符串是 16 位宽的。
    • 对不起,我不知道你的问题的答案。 drawonward 或许可以为您提供更多帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多