+ void *target(reinterpret_cast<uint8_t *>(file) + allocation.offset_);
+ memcpy(target, source, allocation.size_);
+ MachHeader mach_header(target, align + allocation.alloc_);
+
+ struct linkedit_data_command *signature(NULL);
+ _foreach (load_command, mach_header.GetLoadCommands()) {
+ uint32_t cmd(mach_header.Swap(load_command->cmd));
+ if (cmd != LC_CODE_SIGNATURE)
+ continue;
+ signature = reinterpret_cast<struct linkedit_data_command *>(load_command);
+ break;
+ }
+
+ if (signature == NULL) {
+ mach_header->ncmds = mach_header.Swap(mach_header.Swap(mach_header->ncmds) + 1);
+ signature = reinterpret_cast<struct linkedit_data_command *>(reinterpret_cast<uint8_t *>(mach_header.GetLoadCommand()) + mach_header.Swap(mach_header->sizeofcmds));
+ mach_header->sizeofcmds = mach_header.Swap(mach_header.Swap(mach_header->sizeofcmds) + uint32_t(sizeof(*signature)));
+ signature->cmd = mach_header.Swap(LC_CODE_SIGNATURE);
+ signature->cmdsize = mach_header.Swap(uint32_t(sizeof(*signature)));
+ }
+
+ signature->dataoff = mach_header.Swap(align);
+ signature->datasize = mach_header.Swap(allocation.alloc_);