+ if (flag_r) {
+ uint32_t clip(0); {
+ FatHeader fat_header(Map(path));
+ _foreach (mach_header, fat_header.GetMachHeaders()) {
+ mach_header->flags = mach_header.Swap(mach_header.Swap(mach_header->flags) | MH_DYLDLINK);
+
+ uint32_t size(_not(uint32_t)); {
+ _foreach (load_command, mach_header.GetLoadCommands()) {
+ switch (mach_header.Swap(load_command->cmd)) {
+ case LC_CODE_SIGNATURE: {
+ struct linkedit_data_command *signature = reinterpret_cast<struct linkedit_data_command *>(load_command);
+ memset(reinterpret_cast<uint8_t *>(mach_header.GetBase()) + mach_header.Swap(signature->dataoff), 0, mach_header.Swap(signature->datasize));
+ memset(signature, 0, sizeof(struct linkedit_data_command));
+
+ mach_header->ncmds = mach_header.Swap(mach_header.Swap(mach_header->ncmds) - 1);
+ mach_header->sizeofcmds = mach_header.Swap(uint32_t(mach_header.Swap(mach_header->sizeofcmds) - sizeof(struct linkedit_data_command)));
+ } break;
+
+ case LC_SYMTAB: {
+ struct symtab_command *symtab = reinterpret_cast<struct symtab_command *>(load_command);
+ size = mach_header.Swap(symtab->stroff) + mach_header.Swap(symtab->strsize);
+ } break;
+ }
+ }
+ }
+
+ _assert(size != _not(uint32_t));
+
+ _foreach (segment, const_cast<FatMachHeader &>(mach_header).GetSegments("__LINKEDIT")) {
+ segment->filesize -= mach_header.GetSize() - size;
+
+ if (fat_arch *fat_arch = mach_header.GetFatArch()) {
+ fat_arch->size = fat_header.Swap(size);
+ clip = std::max(clip, fat_header.Swap(fat_arch->offset) + size);
+ } else
+ clip = std::max(clip, size);
+ }
+
+ _foreach (segment, const_cast<FatMachHeader &>(mach_header).GetSegments64("__LINKEDIT")) {
+ segment->filesize -= mach_header.GetSize() - size;
+
+ if (fat_arch *fat_arch = mach_header.GetFatArch()) {
+ fat_arch->size = fat_header.Swap(size);
+ clip = std::max(clip, fat_header.Swap(fat_arch->offset) + size);
+ } else
+ clip = std::max(clip, size);
+ }
+ }
+ }
+
+ _assert(clip != 0);
+ _syscall(truncate(path, clip));
+ }
+