在Mach-O里保存着符号表,关于符号表的解释如下,具体可以参考#osx-abi-macho-file-format-reference,这里不多做解释。
在fishhook里用使用如下代码来获取符号表的地址:
// Find base symbol/string table addresses
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);
不管是这里的注释还是网上的文章都称linkedit_base是一个“基址”,搜了很多资料也没提到这个“基址“的定义。个人认为这段代码应该这么理解:
uintptr_t linkedit_base = (uintptr_t)slide + linkedit_segment->vmaddr;
nlist_t *symtab = (nlist_t *)(linkedit_base + symtab_cmd->symoff - linkedit_segment->fileoff);
char *strtab = (char *)(linkedit_base + symtab_cmd->stroff - linkedit_segment->fileoff);
代码这么写就容易理解了
符号表的地址=符号表文件偏移-LINKEDIT.文件偏移+LINKEDIT.vmaddr+slide。