gpt4 book ai didi

objective-c - Mach-O 加载器如何加载不同的 NSString 对象?

转载 作者:太空狗 更新时间:2023-10-30 04:01:43 31 4
gpt4 key购买 nike

我知道如果在 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中的loader是如何在程序运行的时候加载这些NSString的?它们是通过识别 0x0000 分隔符来加载的,还是二进制文件中其他地方的字符串偏移表指向单独的 NSString 对象?谢谢。

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

补充说:我知道如果您在代码中定义像 @"abc"这样的 CString,它将转到 cstring 段。根据我的挖掘,如果它是一个像@"“”"这样的字符串,没有 ascii 字符,它将进入 ustring 部分。

最佳答案

有一个包含所有常量 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 指向该空间。

关于objective-c - Mach-O 加载器如何加载不同的 NSString 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2888758/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com