d77ec799a5
static binary: otool). Dynamic binaires have a pointer to the Mach-O header on the top of the stack, static binaries don't have this, and having it produced a crash. One bugfix: the EXEC_MACHO code assumes that entry = NULL means that the entry point has not been found in the load commands seen so far. Therefore we need to initialized entry to NULL if we want a static binary to discover it. (dynamic binaries were forced to iscover it because when the intepreter load command is found, entry is updated whatever its value was before). One hack: Both COMPAT_MACH and COMPAT_DARWIN are willing to run Mach-O binaries. COMPAT_MACH fails for dynamic binaries because it cannot find the interpreter in /emul/mach. For static binaires, it will accept them (and for Darwin static binaries, this will cause a failure). Until we rite a test for matchinf Darwin static binaries, just swap the order of COMPAT_MACH and COMPAT_DARWIN in the exec switch so that COMPAT_DARWIN is tried first (this will have the advantage of speeding up program startup). EXECSW_PRIO_{FIRST_LAST} does not seem to work...
266 lines
7.2 KiB
C
266 lines
7.2 KiB
C
/* $NetBSD: exec_macho.h,v 1.14 2003/10/19 07:52:22 manu Exp $ */
|
|
|
|
/*-
|
|
* Copyright (c) 2001 The NetBSD Foundation, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This code is derived from software contributed to The NetBSD Foundation
|
|
* by Christos Zoulas.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
* must display the following acknowledgement:
|
|
* This product includes software developed by the NetBSD
|
|
* Foundation, Inc. and its contributors.
|
|
* 4. Neither the name of The NetBSD Foundation nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef _SYS_EXEC_MACHO_H_
|
|
#define _SYS_EXEC_MACHO_H_
|
|
|
|
#include <sys/param.h>
|
|
|
|
#include <machine/int_types.h>
|
|
#include <machine/macho_machdep.h>
|
|
|
|
/*
|
|
* CPU supported by a given arch, in sys/arch/<arch>/<arch>/macho_machdep.c
|
|
*/
|
|
extern u_int32_t exec_macho_supported_cpu[];
|
|
|
|
/*
|
|
* the `fat' binary description
|
|
*/
|
|
struct exec_macho_fat_header {
|
|
__uint32_t magic;
|
|
__uint32_t nfat_arch;
|
|
};
|
|
|
|
#define MACHO_FAT_MAGIC 0xcafebabe
|
|
|
|
/*
|
|
* The fat architecture header
|
|
*/
|
|
struct exec_macho_fat_arch {
|
|
__uint32_t cputype;
|
|
__uint32_t cpusubtype;
|
|
u_long offset;
|
|
u_long size;
|
|
u_long align;
|
|
};
|
|
|
|
#define MACHO_CPU_TYPE_ANY ~0
|
|
#define MACHO_CPU_TYPE_VAX 1
|
|
#define MACHO_CPU_TYPE_MC680x0 6
|
|
#define MACHO_CPU_TYPE_I386 7
|
|
#define MACHO_CPU_TYPE_MIPS 8
|
|
#define MACHO_CPU_TYPE_MC98000 10
|
|
#define MACHO_CPU_TYPE_HPPA 11
|
|
#define MACHO_CPU_TYPE_ARM 12
|
|
#define MACHO_CPU_TYPE_MC88000 13
|
|
#define MACHO_CPU_TYPE_SPARC 14
|
|
#define MACHO_CPU_TYPE_I860 15
|
|
#define MACHO_CPU_TYPE_ALPHA 16
|
|
#define MACHO_CPU_TYPE_POWERPC 18
|
|
|
|
#define MACHO_CPU_SUBTYPE_MULTIPLE ~0
|
|
#define MACHO_CPU_SUBTYPE_LITTLE_ENDIAN 0
|
|
#define MACHO_CPU_SUBTYPE_BIG_ENDIAN 1
|
|
|
|
/*
|
|
* m68k
|
|
*/
|
|
#define MACHO_CPU_SUBTYPE_MC680x0_ALL 1
|
|
#define MACHO_CPU_SUBTYPE_MC68030 1
|
|
#define MACHO_CPU_SUBTYPE_MC68040 2
|
|
#define MACHO_CPU_SUBTYPE_MC68030_ONLY 3
|
|
|
|
/*
|
|
* x86
|
|
*/
|
|
#define MACHO_CPU_SUBTYPE_I386_ALL 3
|
|
#define MACHO_CPU_SUBTYPE_386 3
|
|
#define MACHO_CPU_SUBTYPE_486 4
|
|
#define MACHO_CPU_SUBTYPE_486SX (4 + 128)
|
|
#define MACHO_CPU_SUBTYPE_586 5
|
|
#define MACHO_CPU_SUBTYPE_INTEL(f, m) ((f) + ((m) << 4))
|
|
#define MACHO_CPU_SUBTYPE_PENT MACHO_CPU_SUBTYPE_INTEL(5, 0)
|
|
#define MACHO_CPU_SUBTYPE_PENTPRO MACHO_CPU_SUBTYPE_INTEL(6, 1)
|
|
#define MACHO_CPU_SUBTYPE_PENTII_M3 MACHO_CPU_SUBTYPE_INTEL(6, 3)
|
|
#define MACHO_CPU_SUBTYPE_PENTII_M5 MACHO_CPU_SUBTYPE_INTEL(6, 5)
|
|
#define MACHO_CPU_SUBTYPE_INTEL_FAMILY(x) ((x) & 15)
|
|
#define MACHO_CPU_SUBTYPE_INTEL_FAMILY_MAX 15
|
|
#define MACHO_CPU_SUBTYPE_INTEL_MODEL(x) ((x) >> 4)
|
|
#define MACHO_CPU_SUBTYPE_INTEL_MODEL_ALL 0
|
|
/*
|
|
* PowerPC
|
|
*/
|
|
#define MACHO_CPU_SUBTYPE_POWERPC_ALL 0
|
|
#define MACHO_CPU_SUBTYPE_POWERPC_601 1
|
|
#define MACHO_CPU_SUBTYPE_POWERPC_602 2
|
|
#define MACHO_CPU_SUBTYPE_POWERPC_603 3
|
|
#define MACHO_CPU_SUBTYPE_POWERPC_603e 4
|
|
#define MACHO_CPU_SUBTYPE_POWERPC_603ev 5
|
|
#define MACHO_CPU_SUBTYPE_POWERPC_604 6
|
|
#define MACHO_CPU_SUBTYPE_POWERPC_604e 7
|
|
#define MACHO_CPU_SUBTYPE_POWERPC_620 8
|
|
#define MACHO_CPU_SUBTYPE_POWERPC_750 9
|
|
#define MACHO_CPU_SUBTYPE_POWERPC_7400 10
|
|
#define MACHO_CPU_SUBTYPE_POWERPC_7450 11
|
|
|
|
|
|
struct exec_macho_object_header {
|
|
u_long magic;
|
|
__uint32_t cputype;
|
|
__uint32_t cpusubtype;
|
|
u_long filetype;
|
|
u_long ncmds;
|
|
u_long sizeofcmds;
|
|
u_long flags;
|
|
};
|
|
|
|
#define MACHO_MOH_MAGIC 0xfeedface
|
|
|
|
/*
|
|
* Object header filetype
|
|
*/
|
|
#define MACHO_MOH_OBJECT 0x1
|
|
#define MACHO_MOH_EXECUTE 0x2
|
|
#define MACHO_MOH_FVMLIB 0x3
|
|
#define MACHO_MOH_CORE 0x4
|
|
#define MACHO_MOH_PRELOAD 0x5
|
|
#define MACHO_MOH_DYLIB 0x6
|
|
#define MACHO_MOH_DYLINKER 0x7
|
|
#define MACHO_MOH_BUNDLE 0x8
|
|
|
|
/*
|
|
* Object header flags
|
|
*/
|
|
#define MACHO_MOH_NOUNDEFS 0x001
|
|
#define MACHO_MOH_INCRLINK 0x002
|
|
#define MACHO_MOH_DYLDLINK 0x004
|
|
#define MACHO_MOH_BINDATLOAD 0x008
|
|
#define MACHO_MOH_PREBOUND 0x010
|
|
#define MACHO_MOH_SPLIT_SEGS 0x020
|
|
#define MACHO_MOH_LAZY_INIT 0x040
|
|
#define MACHO_MOH_TWOLEVEL 0x080
|
|
#define MACHO_MOH_FORCE_FLAT 0x100
|
|
|
|
struct exec_macho_load_command {
|
|
u_long cmd;
|
|
u_long cmdsize;
|
|
};
|
|
|
|
#define MACHO_LC_SEGMENT 0x01
|
|
#define MACHO_LC_SYMTAB 0x02
|
|
#define MACHO_LC_SYMSEG 0x03
|
|
#define MACHO_LC_THREAD 0x04
|
|
#define MACHO_LC_UNIXTHREAD 0x05
|
|
#define MACHO_LC_LOADFVMLIB 0x06
|
|
#define MACHO_LC_IDFVMLIB 0x07
|
|
#define MACHO_LC_IDENT 0x08
|
|
#define MACHO_LC_FVMFILE 0x09
|
|
#define MACHO_LC_PREPAGE 0x0a
|
|
#define MACHO_LC_DYSYMTAB 0x0b
|
|
#define MACHO_LC_LOAD_DYLIB 0x0c
|
|
#define MACHO_LC_ID_DYLIB 0x0d
|
|
#define MACHO_LC_LOAD_DYLINKER 0x0e
|
|
#define MACHO_LC_ID_DYLINKER 0x0f
|
|
#define MACHO_LC_PREBOUND_DYLIB 0x10
|
|
#define MACHO_LC_ROUTINES 0x11
|
|
#define MACHO_LC_SUB_FRAMEWORK 0x12
|
|
#define MACHO_LC_SUB_UMBRELLA 0x13
|
|
#define MACHO_LC_SUB_CLIENT 0x14
|
|
|
|
struct exec_macho_segment_command {
|
|
u_long cmd;
|
|
u_long cmdsize;
|
|
char segname[16];
|
|
u_long vmaddr;
|
|
u_long vmsize;
|
|
u_long fileoff;
|
|
u_long filesize;
|
|
__uint32_t maxprot;
|
|
__uint32_t initprot;
|
|
u_long nsects;
|
|
u_long flags;
|
|
};
|
|
|
|
union macho_lc_str {
|
|
u_long offset;
|
|
char *ptr;
|
|
};
|
|
|
|
#define MACHO_SG_HIGHVM 0x1
|
|
#define MACHO_SG_FVMLIB 0x2
|
|
#define MACHO_SG_NORELOC 0x4
|
|
|
|
struct exec_macho_dylinker_command {
|
|
u_long cmd;
|
|
u_long cmdsize;
|
|
union macho_lc_str name;
|
|
};
|
|
|
|
struct exec_macho_dylib {
|
|
union macho_lc_str name;
|
|
u_long timestamp;
|
|
u_long current_version;
|
|
u_long compatibility_version;
|
|
};
|
|
|
|
struct exec_macho_dylib_command {
|
|
u_long cmd;
|
|
u_long cmdsize;
|
|
struct exec_macho_dylib dylib;
|
|
};
|
|
|
|
struct exec_macho_thread_command {
|
|
u_long cmd;
|
|
u_long cmdsize;
|
|
u_long flavor;
|
|
u_long count;
|
|
};
|
|
|
|
struct exec_macho_emul_arg {
|
|
char *path;
|
|
char filename[MAXPATHLEN];
|
|
struct exec_macho_object_header *macho_hdr;
|
|
int dynamic;
|
|
};
|
|
|
|
#ifndef _LKM
|
|
#include "opt_execfmt.h"
|
|
#endif
|
|
|
|
#ifdef _KERNEL
|
|
struct exec_package;
|
|
struct ps_strings;
|
|
u_long exec_macho_thread_entry(struct exec_macho_thread_command *);
|
|
int exec_macho_makecmds __P((struct proc *, struct exec_package *));
|
|
int exec_macho_copyargs __P((struct proc *, struct exec_package *,
|
|
struct ps_strings *, char **, void *));
|
|
#endif /* _KERNEL */
|
|
|
|
#endif /* !_SYS_EXEC_MACHO_H_ */
|