fishhook的源码中有如下代码:
//找到__LINKEDIT的基地址
uintptr_t linkedit_base = (uintptr_t)slide + linkedit_segment->vmaddr - linkedit_segment->fileoff;
//找到符号表的地址
nlist_t *symtab = (nlist_t *)(linkedit_base + symtab_cmd->symoff);
//找到字符串表的地址
char *strtab = (char *)(linkedit_base + symtab_cmd->stroff);
//indirect symbol table
uint32_t *indirect_symtab = (uint32_t *)(linkedit_base + dysymtab_cmd->indirectsymoff);
对linkedit_base有点不理解:
-
这个值不就是header的内存地址吗?也就是MachO文件映射到内存后,文件开头位置0x0对应到内存的位置值
-
MachO文件映射到内存后占用的内存大小就是MachO文件的大小吗?
-
看到有说VM大小应该是大于等于文件大小的,如果是这样,那计算符号表地址的时候是linkedit_base + symtab_cmd->symoff, symtab_cmd->symoff 的意思应该是符号表的位置相对于文件开头0x0的偏移量啊,感觉MachO文件里的各个地址应该是和内存里的地址一一对应才对啊