/** * macho_file_map * * Copy all of the mach-o segments to the proper addresses. */ loader_return_t macho_file_map(loader_context_t * ctx, uint32_t loadaddr) { mach_header_t *mh = (mach_header_t *) ctx->source; struct load_command *lc = (struct load_command *)((mach_header_t *) mh + 1); uint32_t vmsize_count = 0; uint32_t vm_bias = ctx->vm_bias; for_each_lc(lc, mh) { /* Only segments for mapping */ if (lc->cmd == kLoadCommandSegment) { struct segment_command *sc = (struct segment_command *)lc; uint32_t our_vmaddr; /* Add up the vm size */ vmsize_count += sc->vmsize; /* Get the load address */ our_vmaddr = sc->vmaddr - vm_bias; /* Map the binary now */ if (sc->filesize) { bcopy((void *) add_ptr2(ctx->source, sc->fileoff), (void *)add_ptr2(loadaddr, our_vmaddr), sc->filesize); } } else if (lc->cmd == kLoadCommandUnixThread) { /* UnixThread has the entrypoint. */ thread_command_t *tc = (thread_command_t *) lc; ctx->entry = tc->state.pc; } } return kLoadSuccess; }
static void *image3_reserve_data(uint32_t tag, uint32_t length) { uint32_t size, len; Image3Header* header; /* Make it even */ len = (uint32_t)round_up(length + sizeof(Image3Header), 2); size = (uint32_t)round_up(image3core.rootHeader->header.size + len, 16); /* Padding */ len += ((uint32_t)round_up(image3core.rootHeader->header.size + len, 16) - (uint32_t)round_up(image3core.rootHeader->header.size + len, 2)); assert((image3core.rootHeader = realloc(image3core.rootHeader, size))); header = (Image3Header*)add_ptr2(image3core.rootHeader, image3core.rootHeader->header.size); bzero((void*)(header), len); header->dataSize = length; header->size = len; header->magic = tag; image3core.rootHeader->header.size = size; image3core.rootHeader->header.dataSize += len; return (void*)(header + 1); }
/* This is to make sure the DATA is always at 0x40. */ static void *image3_reserve_type(uint32_t tag, uint32_t length) { uint32_t size, len; Image3Header* header; len = length + 28; size = image3core.rootHeader->header.size + len; assert((image3core.rootHeader = realloc(image3core.rootHeader, size))); header = (Image3Header*)add_ptr2(image3core.rootHeader, image3core.rootHeader->header.size); header->dataSize = length; header->size = len; header->magic = tag; image3core.rootHeader->header.size = size; image3core.rootHeader->header.dataSize += len; return (void*)(header + 1); }