images.c   [plain text]


/*
 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
 * Reserved.  This file contains Original Code and/or Modifications of
 * Original Code as defined in and that are subject to the Apple Public
 * Source License Version 1.1 (the "License").  You may not use this file
 * except in compliance with the License.  Please obtain a copy of the
 * License at http://www.apple.com/publicsource and read it before using
 * this file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
 * License for the specific language governing rights and limitations
 * under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */
#ifdef SHLIB
#include "shlib.h"
#endif
#import "stdlib.h"
#import "libc.h"
#import "mach-o/dyld.h"
#import "mach-o/loader.h"
#ifndef __OPENSTEP__
extern const struct section *getsectbyname(
	const char *segname, 
	const char *sectname);
#endif

unsigned long
_dyld_present(
void)
{
	if(getsectbyname("__DATA", "__dyld") != NULL)
	    return(1);
	else
	    return(0);
}

unsigned long
_dyld_image_count(
void)
{
    static unsigned long (*p)(void) = NULL;

	if(_dyld_present() == 0)
	    return(0);
	if(p == NULL)
	    _dyld_func_lookup("__dyld_image_count", (unsigned long *)&p);
	return(p());
}

struct mach_header *
_dyld_get_image_header(
unsigned long image_index)
{
    static struct mach_header * (*p)(unsigned long image_index) = NULL;

	if(p == NULL)
	    _dyld_func_lookup("__dyld_get_image_header", (unsigned long *)&p);
	return(p(image_index));
}

unsigned long
_dyld_get_image_vmaddr_slide(
unsigned long image_index)
{
    static unsigned long (*p)(unsigned long image_index) = NULL;

	if(p == NULL)
	    _dyld_func_lookup("__dyld_get_image_vmaddr_slide",
			      (unsigned long *)&p);
	return(p(image_index));
}

char *
_dyld_get_image_name(
unsigned long image_index)
{
    static char * (*p)(unsigned long image_index) = NULL;

	if(p == NULL)
	    _dyld_func_lookup("__dyld_get_image_name",
			      (unsigned long *)&p);
	return(p(image_index));
}

enum bool
_dyld_image_containing_address(
unsigned long address)
{
    static enum bool (*p)(unsigned long) = NULL;

	if(p == NULL)
	    _dyld_func_lookup("__dyld_image_containing_address",
			      (unsigned long *)&p);
	return(p(address));
}

void _dyld_moninit(
void (*monaddition)(char *lowpc, char *highpc))
{
    static void (*p)(void (*monaddition)(char *lowpc, char *highpc)) = NULL;

	if(p == NULL)
	    _dyld_func_lookup("__dyld_moninit", (unsigned long *)&p);
	p(monaddition);
}

enum bool _dyld_launched_prebound(
void)
{
    static enum bool (*p)(void) = NULL;

	if(p == NULL)
	    _dyld_func_lookup("__dyld_launched_prebound", (unsigned long *)&p);
	return(p());
}