ove*_*ing 4 macos mach-o objective-c loader
我知道如果你在Mac OS的源代码中定义了一堆@""NSString对象.这些NSStrings将存储在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
Run Code Online (Sandbox Code Playgroud)
如果我十六进制转储二进制文件,它们将一个接一个地与0x0000as分隔符紧密对齐.我想知道的是,当程序运行时,Mac OS X中的加载程序如何加载这些NSStrings?是否通过识别0x0000分隔符来简单地加载它们,或者这些是二进制文件中其他地方的字符串偏移表,指向单独的NSString对象?谢谢.
(我真正想要做的是增加一个NSString的长度,所以我必须知道加载器如何识别这些单独的对象)
补充:我知道如果在代码中定义类似@"abc"的CStrings,它将转到cstring段.如果它是一个像@"""这样的字符串,除了ascii字符,它将根据我的挖掘进入ustring部分.
有一个带有所有常量C字符串的cstring部分.每个常量NSString只引用其中一个C字符串.常量NSString的C结构如下所示:
struct NSConstantString {
Class isa;
char *bytes;
int numBytes;
};
Run Code Online (Sandbox Code Playgroud)
看看这一__DATA __cfstring节.
编辑:
__ustring段相当于__cstring段,除了UTF16字符串.因此,常量NSString可以引用ustring或cstring数据.
对ustring数据的唯一引用可能来自它所使用的cfstring.如果你延长一个字符串,引用下一个字符串的cfstring将引用加长字符串的尾部,除非你修复它.您可以在其他地方找到一些可以指向cfstring的空闲空间.
| 归档时间: |
|
| 查看次数: |
895 次 |
| 最近记录: |