#include <mach-o/ldsyms.h>
#include <string.h>
#ifndef __OPENSTEP__
#ifndef RLD
#ifdef __LP64__
extern struct mach_header_64 *_NSGetMachExecuteHeader(void);
#else
#include <crt_externs.h>
#endif
#endif
#else
#ifdef __DYNAMIC__
#include "mach-o/dyld.h"
#endif
#if !defined(__DYNAMIC__)
#define DECLARE_VAR(var, type) \
extern type var
#define SETUP_VAR(var)
#define USE_VAR(var) var
#else
#define STRINGIFY(a) # a
#define DECLARE_VAR(var, type) \
static type * var ## _pointer = 0
#define SETUP_VAR(var) \
if ( var ## _pointer == 0) { \
_dyld_lookup_and_bind( STRINGIFY(_ ## var), \
(unsigned long *) & var ## _pointer, 0); \
}
#define USE_VAR(var) (* var ## _pointer)
#endif
#endif
#ifndef __LP64__
const struct segment_command *
getsegbyname(
char *segname)
{
static struct mach_header *mhp = NULL;
struct segment_command *sgp;
unsigned long i;
#ifndef RLD
#ifndef __OPENSTEP__
if(mhp == NULL)
mhp = _NSGetMachExecuteHeader();
#else
DECLARE_VAR(_mh_execute_header, struct mach_header);
SETUP_VAR(_mh_execute_header);
mhp = (struct mach_header *)(& USE_VAR(_mh_execute_header));
#endif
#else
mhp = (struct mach_header *)(&_mh_execute_header);
#endif
sgp = (struct segment_command *)
((char *)mhp + sizeof(struct mach_header));
for(i = 0; i < mhp->ncmds; i++){
if(sgp->cmd == LC_SEGMENT)
if(strncmp(sgp->segname, segname, sizeof(sgp->segname)) == 0)
return(sgp);
sgp = (struct segment_command *)((char *)sgp + sgp->cmdsize);
}
return(NULL);
}
#else
const struct segment_command_64 *
getsegbyname(
char *segname)
{
static struct mach_header_64 *mhp = NULL;
struct segment_command_64 *sgp;
unsigned long i;
if(mhp == NULL)
#ifndef RLD
mhp = _NSGetMachExecuteHeader();
#else
mhp = (struct mach_header_64 *)(&_mh_execute_header);
#endif
sgp = (struct segment_command_64 *)
((char *)mhp + sizeof(struct mach_header_64));
for(i = 0; i < mhp->ncmds; i++){
if(sgp->cmd == LC_SEGMENT_64)
if(strncmp(sgp->segname, segname, sizeof(sgp->segname)) == 0)
return(sgp);
sgp = (struct segment_command_64 *)((char *)sgp + sgp->cmdsize);
}
return(NULL);
}
#endif