blob: 0330e55477f1cb505b64cb50f8fdf42f6c5be210 [file] [log] [blame]
/**
* Copyright: Copyright Digital Mars 2010-2018.
* License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
* Authors: Jacob Carlborg
* Version: Initial created: Feb 20, 2010-2018
* Source: $(DRUNTIMESRC core/sys/darwin/mach/_loade.d)
*/
module core.sys.darwin.mach.loader;
version (CoreDdoc)
{
/// Represents the header of a Mach-O file for 32-bit architecture.
struct mach_header
{
/// The mach magic number identifier.
uint magic;
/// CPU specifier.
int cputype;
/// Machine specifier.
int cpusubtype;
/// The type of the file.
uint filetype;
/// Number of load commands.
uint ncmds;
/// The size of all the load commands.
uint sizeofcmds;
/// Flags.
uint flags;
}
/// Represents the header of a Mach-O file for 64-bit architecture.
struct mach_header_64
{
/// The mach magic number identifier.
uint magic;
/// CPU specifier.
int cputype;
/// Machine specifier.
int cpusubtype;
/// The type of the file.
uint filetype;
/// Number of load commands.
uint ncmds;
/// The size of all the load commands.
uint sizeofcmds;
/// Flags.
uint flags;
/// Reserved.
uint reserved;
}
///
enum MH_MAGIC : uint;
///
enum MH_CIGAM : uint;
///
enum MH_MAGIC_64 : uint;
///
enum MH_CIGAM_64 : uint;
///
enum SEG_PAGEZERO : string;
///
enum SEG_TEXT : string;
///
enum SECT_TEXT : string;
///
enum SECT_FVMLIB_INIT0 : string;
///
enum SECT_FVMLIB_INIT1 : string;
///
enum SEG_DATA : string;
///
enum SECT_DATA : string;
///
enum SECT_BSS : string;
///
enum SECT_COMMON : string;
///
enum SEG_OBJC : string;
///
enum SECT_OBJC_SYMBOLS : string;
///
enum SECT_OBJC_MODULES : string;
///
enum SECT_OBJC_STRINGS : string;
///
enum SECT_OBJC_REFS : string;
///
enum SEG_ICON : string;
///
enum SECT_ICON_HEADER : string;
///
enum SECT_ICON_TIFF : string;
///
enum SEG_LINKEDIT : string;
///
enum SEG_UNIXSTACK : string;
///
enum SEG_IMPORT : string;
/// Represents a segment command in a Mach-O file for 32-bit architecture.
struct segment_command
{
/// Type of load command, i.e. `LC_SEGMENT`.
uint cmd;
/// The size of this segment, includes size of section structs.
uint cmdsize;
/// The name of this segment.
char[16] segname = 0;
/// Memory address of this segment.
uint vmaddr;
/// Memory size of this segment.
uint vmsize;
/// File offset of this segment.
uint fileoff;
/// Amount to map from the file.
uint filesize;
/// Maximum VM protection.
int maxprot;
/// Initial VM protection.
int initprot;
/// Number of sections in this segment.
uint nsects;
/// Flags.
uint flags;
}
/// Represents a segment command in a Mach-O file for 64-bit architecture.
struct segment_command_64
{
/// Type of load command, i.e. `LC_SEGMENT`.
uint cmd;
/// The size of this segment, includes size of section structs.
uint cmdsize;
/// The name of this segment.
char[16] segname = 0;
/// Memory address of this segment.
long vmaddr;
/// Memory size of this segment.
long vmsize;
/// File offset of this segment.
long fileoff;
/// Amount to map from the file.
long filesize;
/// Maximum VM protection.
int maxprot;
/// Initial VM protection.
int initprot;
/// Number of sections in this segment.
uint nsects;
/// Flags.
uint flags;
}
/// Represents a section in a Mach-O file for 32-bit architecture.
struct section
{
/// The name of this this section.
char[16] sectname = 0;
/// The name of the segment this section belongs to.
char[16] segname = 0;
/// The memory address of this section.
uint addr;
/// The size of this section in bytes.
uint size;
/// The file offset of this section.
uint offset;
/// The alignment (power of two) of this section.
uint align_;
/// The file offset of the relocation entries.
uint reloff;
/// The number of relocation entries.
uint nreloc;
/// Flags, section type and attributes.
uint flags;
/// Reserved.
uint reserved1;
/// Reserved.
uint reserved2;
}
/// Represents a section in a Mach-O file for 64-bit architecture.
struct section_64
{
/// The name of this this section.
char[16] sectname = 0;
/// The name of the segment this section belongs to.
char[16] segname = 0;
/// The memory address of this section.
ulong addr;
/// The size of this section in bytes.
ulong size;
/// The file offset of this section.
uint offset;
/// The alignment (power of two) of this section.
uint align_;
/// The file offset of the relocation entries.
uint reloff;
/// The number of relocation entries.
uint nreloc;
/// Flags, section type and attributes.
uint flags;
/// Reserved.
uint reserved1;
/// Reserved.
uint reserved2;
/// Reserved.
uint reserved3;
}
}
else version (OSX)
version = Darwin;
else version (iOS)
version = Darwin;
else version (TVOS)
version = Darwin;
else version (WatchOS)
version = Darwin;
version (Darwin):
extern (C):
struct mach_header
{
uint magic;
int cputype;
int cpusubtype;
uint filetype;
uint ncmds;
uint sizeofcmds;
uint flags;
}
struct mach_header_64
{
uint magic;
int cputype;
int cpusubtype;
uint filetype;
uint ncmds;
uint sizeofcmds;
uint flags;
uint reserved;
}
enum uint MH_MAGIC = 0xfeedface;
enum uint MH_CIGAM = 0xcefaedfe;
enum uint MH_MAGIC_64 = 0xfeedfacf;
enum uint MH_CIGAM_64 = 0xcffaedfe;
enum SEG_PAGEZERO = "__PAGEZERO";
enum SEG_TEXT = "__TEXT";
enum SECT_TEXT = "__text";
enum SECT_FVMLIB_INIT0 = "__fvmlib_init0";
enum SECT_FVMLIB_INIT1 = "__fvmlib_init1";
enum SEG_DATA = "__DATA";
enum SECT_DATA = "__data";
enum SECT_BSS = "__bss";
enum SECT_COMMON = "__common";
enum SEG_OBJC = "__OBJC";
enum SECT_OBJC_SYMBOLS = "__symbol_table";
enum SECT_OBJC_MODULES = "__module_info";
enum SECT_OBJC_STRINGS = "__selector_strs";
enum SECT_OBJC_REFS = "__selector_refs";
enum SEG_ICON = "__ICON";
enum SECT_ICON_HEADER = "__header";
enum SECT_ICON_TIFF = "__tiff";
enum SEG_LINKEDIT = "__LINKEDIT";
enum SEG_UNIXSTACK = "__UNIXSTACK";
enum SEG_IMPORT = "__IMPORT";
struct segment_command
{
uint cmd;
uint cmdsize;
char[16] segname = 0;
uint vmaddr;
uint vmsize;
uint fileoff;
uint filesize;
int maxprot;
int initprot;
uint nsects;
uint flags;
}
struct segment_command_64
{
uint cmd;
uint cmdsize;
char[16] segname = 0;
long vmaddr;
long vmsize;
long fileoff;
long filesize;
int maxprot;
int initprot;
uint nsects;
uint flags;
}
struct section
{
char[16] sectname = 0;
char[16] segname = 0;
uint addr;
uint size;
uint offset;
uint align_;
uint reloff;
uint nreloc;
uint flags;
uint reserved1;
uint reserved2;
}
struct section_64
{
char[16] sectname = 0;
char[16] segname = 0;
ulong addr;
ulong size;
uint offset;
uint align_;
uint reloff;
uint nreloc;
uint flags;
uint reserved1;
uint reserved2;
uint reserved3;
}