/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8     -*-│
│ vi: set noet ft=asm ts=8 sw=8 fenc=utf-8                                 :vi │
╞══════════════════════════════════════════════════════════════════════════════╡
│ Copyright 2021 Justine Alexandra Roberts Tunney                              │
│                                                                              │
│ Permission to use, copy, modify, and/or distribute this software for         │
│ any purpose with or without fee is hereby granted, provided that the         │
│ above copyright notice and this permission notice appear in all copies.      │
│                                                                              │
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL                │
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED                │
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE             │
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL         │
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR        │
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER               │
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR             │
│ PERFORMANCE OF THIS SOFTWARE.                                                │
╚─────────────────────────────────────────────────────────────────────────────*/
#include "libc/macho.h"
#include "libc/sysv/consts/prot.h"
#include "libc/dce.h"
#include "libc/macros.h"

//	Apple Mach-O Executable Headers
//	Fixups are applied by objbincopy
//	There must exist a MAC_LC_SEGMENT_64 for every PT_LOAD

	.section .macho,"a",@progbits
	.balign	64
	.long	0xFEEDFACE+1
	.long	MAC_CPU_NEXGEN32E
	.long	MAC_CPU_NEXGEN32E_ALL
	.long	MAC_EXECUTE
	.long	5				// number of load commands
	.long	60f-10f				// size of all load commands
	.long	MAC_NOUNDEFS|MAC_SPLIT_SEGS	// flags
	.long	0				// reserved
10:	.long	MAC_LC_SEGMENT_64
	.long	20f-10b				// unmaps first page dir
	.ascin	"__PAGEZERO",16			// consistent with linux
	.quad	0,0x200000,0,0			// which forbids mem <2m
	.long	0,0,0,0
20:	.long	MAC_LC_SEGMENT_64
	.long	30f-20b
	.ascin	"__TEXT",16
	.quad	0				// vaddr
	.quad	0				// memsz
	.quad	0				// file offset
	.quad	0				// file size
	.long	0				// maxprot
	.long	0				// initprot
	.long	0				// segment section count
	.long	0				// flags
30:	.long	MAC_LC_SEGMENT_64
	.long	40f-30b
	.ascin	"__RODATA",16
	.quad	0				// vaddr
	.quad	0				// memsz
	.quad	0				// file offset
	.quad	0				// file size
	.long	0				// maxprot
	.long	0				// initprot
	.long	0				// segment section count
	.long	0				// flags
40:	.long	MAC_LC_UUID
	.long	50f-40b
	.quad	0x4527148ba7a513ef		// uuid1
	.quad	0x56fa865940665e8f		// uuid2
50:	.long	MAC_LC_UNIXTHREAD
	.long	60f-50b				// cmdsize
	.long	MAC_THREAD_NEXGEN32E		// flavaflav
	.long	(520f-510f)/4			// count
510:	.quad	0				// rax
	.quad	0				// rbx
	.quad	0				// rcx
	.quad	0				// rdx
	.quad	0				// rdi
	.quad	0				// rsi
	.quad	0				// rbp
	.quad	0				// rsp
	.quad	0				// r8
	.quad	0				// r9
	.quad	0				// r10
	.quad	0				// r11
	.quad	0				// r12
	.quad	0				// r13
	.quad	0				// r14
	.quad	0				// r15
	.quad	XnuEntrypoint			// rip
	.quad	0				// rflags
	.quad	0				// cs
	.quad	0				// fs
	.quad	0				// gs
520:
60: