/**
 * 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;
}
Exemple #2
0
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);
}
Exemple #3
0
/* 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);
}