2020-06-15 14:18:57 +00:00
|
|
|
|
/*-*- mode: ld-script; indent-tabs-mode: nil; tab-width: 2; coding: utf-8 -*-│
|
|
|
|
|
│vi: set et sts=2 tw=2 fenc=utf-8 :vi│
|
|
|
|
|
╞══════════════════════════════════════════════════════════════════════════════╡
|
|
|
|
|
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
|
|
|
|
│ │
|
2020-12-28 01:18:44 +00:00
|
|
|
|
│ 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. │
|
2020-06-15 14:18:57 +00:00
|
|
|
|
│ │
|
2020-12-28 01:18:44 +00:00
|
|
|
|
│ 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. │
|
2020-06-15 14:18:57 +00:00
|
|
|
|
╠──────────────────────────────────────────────────────────────────────────────╣
|
|
|
|
|
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
|
|
|
|
│░░░░░░░█▀█░█▀█░▀█▀░█░█░█▀█░█░░░█░░░█░█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
|
|
|
|
│░░░░░░░█▀█░█░▄░░█░░█░█░█▀█░█░░░█░░░▀█▀░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
|
|
|
|
│░░░░░░░▀░▀░▀▀▀░░▀░░▀▀▀░▀░▀░▀▀▀░▀▀▀░░▀░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
|
|
|
|
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
|
|
|
|
│░░░░░░░█▀█░█▀█░█▀█░▀█▀░█▀█░█▀█░█░░░█▀▀░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
|
|
|
|
│░░░░░░░█▀▀░█ █░██▀░░█░░█▀█░█▀█░█░░░█▀▀░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
|
|
|
|
│░░░░░░░▀░░░▀▀▀░▀░▀░░▀░░▀░▀░▀▀▀░▀▀▀░▀▀▀░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
|
|
|
|
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
|
|
|
|
│░░░░░░░█▀▀░█░█░█▀▀░█▀█░█░█░▀█▀░█▀█░█▀█░█░░█▀▀░░░░░░░░░░░░░░░░░░░░░░░░▄▄░░░▐█░░│
|
|
|
|
|
│░░░░░░░█▀▀░▄▀▄░█▀▀░█░▄░█░█░░█░░█▀█░█▀█░█░░█▀▀░░░░░░░░░░░░▄▄▄░░░▄██▄░░█▀░░░█░▄░│
|
|
|
|
|
│░░░░░░░▀▀▀░▀░▀░▀▀▀░▀▀▀░▀▀▀░░▀░░▀░▀░▀▀▀░▀▀░▀▀▀░░░░░░░░░░▄██▀█▌░██▄▄░░▐█▀▄░▐█▀░░│
|
|
|
|
|
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▐█▀▀▌░░░▄▀▌░▌░█░▌░░▌░▌░░│
|
|
|
|
|
╠──────────────────────────────────────────────────────▌▀▄─▐──▀▄─▐▄─▐▄▐▄─▐▄─▐▄─│
|
|
|
|
|
│ αcτµαlly pδrταblε εxεcµταblε § linker │
|
|
|
|
|
╚──────────────────────────────────────────────────────────────────────────────╝
|
|
|
|
|
Having an executable run natively on stock Windows / Mac / Linux / BSD
|
|
|
|
|
entails two steps: (1) create a .com.dbg binary w/ Linux toolchain and
|
|
|
|
|
then (2) unwrap the .com binary embedded within:
|
|
|
|
|
|
2021-02-08 17:19:00 +00:00
|
|
|
|
objcopy -S -O binary input.com.dbg output.com
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
Both executables will work fine, but only the .com format is portable.
|
|
|
|
|
|
|
|
|
|
───BUILDING─────────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
LC_ALL=C ld -T ape/ape.lds ...
|
|
|
|
|
|
|
|
|
|
───RUNNING──────────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
./foo.com.dbg # works on host machine
|
|
|
|
|
./foo.com # works on any os / arch
|
|
|
|
|
qemu-system-x86_64 -s foo.com # works on any os / arch
|
|
|
|
|
|
|
|
|
|
───BACKGROUND───────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
The purpose of this software is to help native programs have the same
|
|
|
|
|
level of consistency, in terms of user experience, that we enjoy with
|
|
|
|
|
web applications. It's basically like MeteorJS, except primarily CLI,
|
|
|
|
|
bootable, and more on the order of a few kilobytes than hundred megs.
|
|
|
|
|
|
|
|
|
|
Rather than Isomorphic JavaScript it's built using Isomorphic Binary,
|
|
|
|
|
since it grants the fastest possible performance and can be trivially
|
|
|
|
|
emulated in the browser. System resource utilization is also a few kb
|
|
|
|
|
and GUIs are possible too since Cosmopolitan exports the Windows API,
|
|
|
|
|
but we recommend doing it with a CLI web server instead and embedding
|
|
|
|
|
files in your αcτµαlly pδrταblε εxεcµταblε as it's isomorphic to zip.
|
|
|
|
|
|
|
|
|
|
Isomorphic Binary principles state that most platform differences are
|
|
|
|
|
just numbers, which we integrate easily into a unified business logic
|
|
|
|
|
through the use of a sufficiently powerful linker. System numbers are
|
|
|
|
|
otherwise known as ABIs and they're usually the most stable canonical
|
|
|
|
|
interfaces that platforms provide. This is how we are able to support
|
|
|
|
|
more versions of Linux than most Linux-only software, e.g. glibc FTMP
|
|
|
|
|
|
|
|
|
|
───DEBUGGING────────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
Can be done in a few ways:
|
|
|
|
|
|
|
|
|
|
gdb --tui foo.com.dbg
|
|
|
|
|
gdb --tui foo.com -ex 'add-symbol-file foo.com.dbg 0x200000'
|
|
|
|
|
gdb --tui -ex 'add-symbol-file foo.com.dbg 0x7c00' \
|
|
|
|
|
-ex 'add-symbol-file foo.com.dbg 0x200000' \
|
|
|
|
|
-ex -target remote localhost:1234'
|
|
|
|
|
|
|
|
|
|
───TRANSPARENCY─────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
αcτµαlly pδrταblε εxεcµταblε is designed to facilitate maximum
|
|
|
|
|
transparency to engender trust in this linker process.
|
|
|
|
|
|
|
|
|
|
The headers and symbols can be viewed using readelf or objdump:
|
|
|
|
|
|
|
|
|
|
readelf -Wa input.com.dbg # maximum transparency
|
|
|
|
|
objdump -wxd input.com.dbg # maximum transparency
|
|
|
|
|
|
|
|
|
|
The disassembly can be viewed using objdump:
|
|
|
|
|
|
|
|
|
|
readelf -Wa input.com.dbg # maximum transparency
|
|
|
|
|
objdump -d input.com.dbg # maximum transparency
|
|
|
|
|
objdump -dj.text input.com.dbg # skip αpε boilerplate
|
|
|
|
|
objdump -j.load -dMi8086 input.com.dbg # fixes real mode code
|
|
|
|
|
|
|
|
|
|
Some commands for controlling the verbosity of binaries:
|
|
|
|
|
|
|
|
|
|
strip -X input.com.dbg # remove ".L" symbols
|
|
|
|
|
strip input.com.dbg # remove all symbols
|
|
|
|
|
strip -S input.com.dbg # remove debug info only
|
|
|
|
|
make CPPFLAGS=-DNDEBUG # remove asserts (prod)
|
2020-06-16 02:01:28 +00:00
|
|
|
|
make CPPFLAGS=-DIM_FEELING_NAUGHTY # remove legal embeddings
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
The Makefile build is also configured to always produce a .map file
|
|
|
|
|
when building each program, which provides further details.
|
|
|
|
|
|
|
|
|
|
───HACKABILITY──────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
Your linker and assemblies were designed provide extensibility through
|
|
|
|
|
the use of link-time data structures we call "decentralized sections".
|
|
|
|
|
They allow functions like _init() to be comprised of many small pieces
|
|
|
|
|
defined throughout the codebase. The same applies to ELF / PE headers.
|
|
|
|
|
|
|
|
|
|
Extending that content usually entails writing a .S file. The process
|
|
|
|
|
has more in common with JavaScript programming than contemporary C++
|
|
|
|
|
development practices. It's the reason Cosmopolitan is able to build
|
|
|
|
|
the fast tiny multiplatform autonomous binaries that indie developers
|
|
|
|
|
love using a scalable development model that big businesses respect.
|
|
|
|
|
|
|
|
|
|
───SECURITY─────────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
αcτµαlly pδrταblε εxεcµταblε is designed to be secure in untrustworthy
|
|
|
|
|
computing environments. Code and data are separated. Data structures
|
|
|
|
|
initialized at startup are automatically memory protected afterwards.
|
|
|
|
|
Code intended for platforms you don't use is automatically unmapped
|
|
|
|
|
too, minimizing any possible chance of impacting your system, while
|
|
|
|
|
still being there in case you ever need it.
|
|
|
|
|
|
|
|
|
|
───CONFIDENTIALITY──────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
αcτµαlly pδrταblε εxεcµταblε is also designed to not leak confidential
|
|
|
|
|
information by default. Details relating to the host build environment
|
|
|
|
|
such as system/library versions, user ids, home folder locations, etc.
|
|
|
|
|
are not taken into consideration at build time since it's hermetic. We
|
|
|
|
|
can't make speak for debug information, which is why it's put in other
|
|
|
|
|
files. We also provide the bing and fold programs for auditing binary.
|
|
|
|
|
|
|
|
|
|
───DESIGN─DETAILS───────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
αcτµαlly pδrταblε εxεcµταblε is a non-reflective (a.k.a. flat) binary
|
|
|
|
|
format that includes ELF, PE, and Macho-O headers only to respect the
|
|
|
|
|
initialization rituals that supported platforms require.
|
|
|
|
|
|
|
|
|
|
Binaries are sparse because Intel's six thousand page manual says:
|
|
|
|
|
|
|
|
|
|
“Always put code and data on separate pages. [...] If code is
|
|
|
|
|
to be modified, try to do it all at once and make sure the
|
|
|
|
|
code that performs the modifications and the code being
|
|
|
|
|
modified are on separate 4KByte pages or on separate aligned
|
|
|
|
|
1-KByte subpages. [...] If (hopefully read-only) data must
|
|
|
|
|
occur on the same page as code, avoid placing it immediately
|
|
|
|
|
after an indirect jump [...] or inserting an illegal opcode
|
|
|
|
|
[...] after the indirect branch [which] may degrade perf in
|
|
|
|
|
some circumstances.” ──Intel V.O §3.6.9
|
|
|
|
|
|
|
|
|
|
Support for linking dynamic shared objects is only implemented on
|
|
|
|
|
Windows NT for the reasons described by Ulrich Drepper in his DSO
|
|
|
|
|
tutorial. We've implemented this independently of the ld codebase
|
|
|
|
|
because authentic GNU tooling is powerful enough to generalize to
|
|
|
|
|
arbitrary formats without needing to add features to its codebase.
|
|
|
|
|
|
|
|
|
|
Cosmopolitan core library functions may be converted to the COFF or
|
|
|
|
|
Mach-O object formats using objconv. That gives you some freedom to
|
|
|
|
|
choose to use the Microsoft or Apple linker instead of this one. We
|
|
|
|
|
otherwise can't use those formats, due to how they heavily restrict
|
|
|
|
|
naming, which basically makes everything we're doing impossible. In
|
|
|
|
|
the future an authentic GNU toolchain will be made available on the
|
|
|
|
|
Windows and Apple platforms, using canonical formats and behaviors.
|
|
|
|
|
Until then, we can build for those platforms using Linux or WSL. */
|
|
|
|
|
|
|
|
|
|
#ifdef __LINKER__
|
2020-12-01 11:43:40 +00:00
|
|
|
|
#include "ape/macros.internal.h"
|
2021-02-24 04:23:19 +00:00
|
|
|
|
#include "ape/relocations.h"
|
2021-02-08 12:04:42 +00:00
|
|
|
|
#include "libc/dce.h"
|
2022-04-13 05:11:00 +00:00
|
|
|
|
#include "libc/elf/def.h"
|
|
|
|
|
#include "libc/elf/pf2prot.internal.h"
|
2020-11-25 16:19:00 +00:00
|
|
|
|
#include "libc/nt/pedef.internal.h"
|
2022-09-10 18:49:13 +00:00
|
|
|
|
#include "libc/thread/tls.h"
|
2020-06-15 14:18:57 +00:00
|
|
|
|
#include "libc/zip.h"
|
|
|
|
|
|
|
|
|
|
ENTRY(_start)
|
|
|
|
|
|
|
|
|
|
PHDRS {
|
2022-05-27 20:25:46 +00:00
|
|
|
|
Head PT_LOAD FLAGS(PF_X|PF_R);
|
|
|
|
|
Rom PT_LOAD FLAGS(PF_X|PF_R);
|
|
|
|
|
Ram PT_LOAD FLAGS(PF_W|PF_R);
|
|
|
|
|
Tls PT_TLS FLAGS(PF_W|PF_R);
|
|
|
|
|
Bss PT_LOAD FLAGS(PF_W|PF_R);
|
|
|
|
|
stack PT_GNU_STACK FLAGS(PF_W|PF_R);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SECTIONS {
|
|
|
|
|
|
|
|
|
|
/*BEGIN: realmode addressability guarantee */
|
|
|
|
|
/*BEGIN: xnu addressability guarantee */
|
|
|
|
|
/*BEGIN: linux addressability guarantee */
|
|
|
|
|
/*BEGIN: bsd addressability guarantee */
|
|
|
|
|
|
2021-02-24 04:23:19 +00:00
|
|
|
|
.head SEGMENT_START("text-segment", IMAGE_BASE_VIRTUAL) : AT(IMAGE_BASE_REAL) {
|
2020-06-15 14:18:57 +00:00
|
|
|
|
HIDDEN(_base = .);
|
|
|
|
|
|
|
|
|
|
/* Real Mode */
|
|
|
|
|
KEEP(*(.head))
|
2021-08-12 07:42:14 +00:00
|
|
|
|
KEEP(*(.apesh))
|
|
|
|
|
KEEP(*(.head2))
|
2021-02-24 04:23:19 +00:00
|
|
|
|
KEEP(*(.text.head))
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
/* Executable & Linkable Format */
|
2021-02-11 16:37:18 +00:00
|
|
|
|
. = ALIGN(__SIZEOF_POINTER__);
|
|
|
|
|
HIDDEN(ape_phdrs = .);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
KEEP(*(.elf.phdrs))
|
2021-02-08 17:19:00 +00:00
|
|
|
|
HIDDEN(ape_phdrs_end = .);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
/* OpenBSD */
|
2021-02-11 16:37:18 +00:00
|
|
|
|
. = ALIGN(__SIZEOF_POINTER__);
|
2021-02-08 17:19:00 +00:00
|
|
|
|
HIDDEN(ape_note = .);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
KEEP(*(.note.openbsd.ident))
|
2021-02-05 14:16:20 +00:00
|
|
|
|
KEEP(*(.note.netbsd.ident))
|
2021-02-08 17:19:00 +00:00
|
|
|
|
HIDDEN(ape_note_end = .);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
/* Portable Executable */
|
|
|
|
|
KEEP(*(.pe.header))
|
2021-02-08 17:19:00 +00:00
|
|
|
|
HIDDEN(ape_pe_sections = .);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
KEEP(*(.pe.sections))
|
2021-02-08 17:19:00 +00:00
|
|
|
|
HIDDEN(ape_pe_sections_end = .);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
/* Mach-O */
|
|
|
|
|
KEEP(*(.macho))
|
|
|
|
|
. = ALIGN(__SIZEOF_POINTER__);
|
2021-02-08 17:19:00 +00:00
|
|
|
|
HIDDEN(ape_macho_end = .);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
KEEP(*(.ape.pad.head))
|
2021-02-24 04:23:19 +00:00
|
|
|
|
. = ALIGN(SupportsWindows() || SupportsMetal() ? PAGESIZE : 16);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
HIDDEN(_ehead = .);
|
2021-02-08 17:19:00 +00:00
|
|
|
|
} :Head
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
/*BEGIN: nt addressability guarantee */
|
|
|
|
|
|
|
|
|
|
.text . : {
|
2021-09-28 05:58:51 +00:00
|
|
|
|
BYTE(0x90) /* TODO: fix blinkenlights symbol __map_phdrs */
|
2020-06-15 14:18:57 +00:00
|
|
|
|
/* Code that needs to be addressable in Real Mode */
|
|
|
|
|
*(.text.real)
|
|
|
|
|
KEEP(*(SORT_BY_NAME(.sort.text.real.*)))
|
2022-05-22 11:51:02 +00:00
|
|
|
|
/* Code we want earlier in the binary w/o modifications */
|
|
|
|
|
KEEP(*(.ape.loader))
|
2020-06-15 14:18:57 +00:00
|
|
|
|
HIDDEN(_ereal = .);
|
|
|
|
|
/*END: realmode addressability guarantee */
|
2022-05-22 11:51:02 +00:00
|
|
|
|
/*BEGIN: morphable code */
|
|
|
|
|
. += 1;
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
/* Normal Code */
|
|
|
|
|
*(.start)
|
|
|
|
|
KEEP(*(.initprologue))
|
|
|
|
|
KEEP(*(SORT_BY_NAME(.init.*)))
|
2021-02-08 17:19:00 +00:00
|
|
|
|
KEEP(*(.init))
|
2020-06-15 14:18:57 +00:00
|
|
|
|
KEEP(*(.initepilogue))
|
|
|
|
|
KEEP(*(.pltprologue))
|
|
|
|
|
*(.plt)
|
|
|
|
|
KEEP(*(.pltepilogue))
|
|
|
|
|
KEEP(*(.pltgotprologue))
|
|
|
|
|
*(.plt.got)
|
|
|
|
|
KEEP(*(.pltgotepilogue))
|
|
|
|
|
*(.text.startup .text.startup.*)
|
|
|
|
|
*(.text.exit .text.exit.*)
|
|
|
|
|
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
|
|
|
|
|
*(SORT_BY_ALIGNMENT(.text.antiquity))
|
|
|
|
|
*(SORT_BY_ALIGNMENT(.text.antiquity.*))
|
|
|
|
|
KEEP(*(.textwindowsprologue))
|
|
|
|
|
*(.text.windows)
|
|
|
|
|
KEEP(*(.textwindowsepilogue))
|
|
|
|
|
*(SORT_BY_ALIGNMENT(.text.modernity))
|
|
|
|
|
*(SORT_BY_ALIGNMENT(.text.modernity.*))
|
|
|
|
|
*(SORT_BY_ALIGNMENT(.text.hot))
|
|
|
|
|
*(SORT_BY_ALIGNMENT(.text.hot.*))
|
|
|
|
|
KEEP(*(.keep.text))
|
|
|
|
|
*(.text .stub .text.*)
|
|
|
|
|
KEEP(*(SORT_BY_NAME(.sort.text.*)))
|
2022-09-06 14:04:13 +00:00
|
|
|
|
*(.subrs)
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
KEEP(*(.ape.pad.test));
|
|
|
|
|
*(.test.unlikely)
|
|
|
|
|
*(.test .test.*)
|
|
|
|
|
|
|
|
|
|
/* Privileged code invulnerable to magic */
|
|
|
|
|
KEEP(*(.ape.pad.privileged));
|
2021-02-27 18:33:32 +00:00
|
|
|
|
. += . > 0 ? 1 : 0;
|
2022-05-22 11:51:02 +00:00
|
|
|
|
/*END: morphable code */
|
2020-06-15 14:18:57 +00:00
|
|
|
|
HIDDEN(__privileged_start = .);
|
2021-02-27 18:33:32 +00:00
|
|
|
|
. += . > 0 ? 1 : 0;
|
2020-06-15 14:18:57 +00:00
|
|
|
|
*(.privileged)
|
2021-02-06 11:17:41 +00:00
|
|
|
|
HIDDEN(__privileged_end = .);
|
2021-02-27 18:33:32 +00:00
|
|
|
|
. += . > 0 ? 1 : 0;
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
/*BEGIN: Read Only Data */
|
|
|
|
|
|
|
|
|
|
KEEP(*(.ape.pad.rodata));
|
2021-09-07 18:40:11 +00:00
|
|
|
|
KEEP(*(.rodata.pytab.0));
|
|
|
|
|
KEEP(*(.rodata.pytab.1));
|
|
|
|
|
KEEP(*(.rodata.pytab.2));
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
*(.rodata .rodata.*)
|
|
|
|
|
*(.ubsan.types)
|
|
|
|
|
*(.ubsan.data)
|
|
|
|
|
|
|
|
|
|
/* Unit Test & Fixture Registry */
|
|
|
|
|
|
|
|
|
|
/*BEGIN: Read only data that needn't be mapped after initialization */
|
|
|
|
|
|
|
|
|
|
/* Legal Notices */
|
2020-07-01 02:55:47 +00:00
|
|
|
|
#if !defined(IM_FEELING_NAUGHTY) || defined(EMBED_NOTICES)
|
2020-06-15 14:18:57 +00:00
|
|
|
|
KEEP(*(.commentprologue))
|
|
|
|
|
KEEP(*(.comment))
|
|
|
|
|
KEEP(*(.commentepilogue))
|
2020-06-16 02:01:28 +00:00
|
|
|
|
#endif
|
2021-02-27 18:33:32 +00:00
|
|
|
|
|
2020-06-15 14:18:57 +00:00
|
|
|
|
/* Windows DLL Import Directory */
|
|
|
|
|
KEEP(*(.idata.ro));
|
|
|
|
|
KEEP(*(SORT_BY_NAME(.idata.ro.*)))
|
|
|
|
|
|
2021-02-08 12:04:42 +00:00
|
|
|
|
. = ALIGN(__SIZEOF_POINTER__);
|
|
|
|
|
PROVIDE_HIDDEN(__init_array_start = .);
|
|
|
|
|
KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)
|
|
|
|
|
SORT_BY_INIT_PRIORITY(.ctors.*)))
|
2021-02-08 17:19:00 +00:00
|
|
|
|
KEEP(*(.ctors))
|
|
|
|
|
KEEP(*(.init_array))
|
|
|
|
|
KEEP(*(.preinit_array))
|
2021-02-08 12:04:42 +00:00
|
|
|
|
PROVIDE_HIDDEN(__init_array_end = .);
|
|
|
|
|
|
|
|
|
|
. = ALIGN(__SIZEOF_POINTER__);
|
|
|
|
|
PROVIDE_HIDDEN(__fini_array_start = .);
|
|
|
|
|
KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)
|
|
|
|
|
SORT_BY_INIT_PRIORITY(.dtors.*)))
|
2021-02-08 17:19:00 +00:00
|
|
|
|
KEEP(*(.dtors))
|
2021-02-08 12:04:42 +00:00
|
|
|
|
PROVIDE_HIDDEN(__fini_array_end = .);
|
|
|
|
|
|
2020-06-15 14:18:57 +00:00
|
|
|
|
/* Encoded Data Structures w/ Linear Initialization Order */
|
|
|
|
|
KEEP(*(.initroprologue))
|
|
|
|
|
KEEP(*(SORT_BY_NAME(.initro.*)))
|
|
|
|
|
KEEP(*(.initroepilogue))
|
|
|
|
|
KEEP(*(SORT_BY_NAME(.sort.rodata.*)))
|
|
|
|
|
|
|
|
|
|
KEEP(*(.ape.pad.text))
|
2021-02-08 17:19:00 +00:00
|
|
|
|
. = ALIGN(PAGESIZE);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
HIDDEN(_etext = .);
|
|
|
|
|
PROVIDE_HIDDEN(etext = .);
|
|
|
|
|
/*END: Read Only Data (only needed for initialization) */
|
|
|
|
|
/*END: Read Only Data */
|
2021-02-08 17:19:00 +00:00
|
|
|
|
} :Rom
|
2022-03-20 15:01:14 +00:00
|
|
|
|
|
2022-05-27 20:25:46 +00:00
|
|
|
|
.data ALIGN(PAGESIZE) : {
|
2020-06-15 14:18:57 +00:00
|
|
|
|
/*BEGIN: Read/Write Data */
|
2022-03-20 15:01:14 +00:00
|
|
|
|
KEEP(*(SORT_BY_NAME(.piro.data.sort.iat.*)))
|
|
|
|
|
/*BEGIN: NT FORK COPYING */
|
2020-06-15 14:18:57 +00:00
|
|
|
|
KEEP(*(.dataprologue))
|
|
|
|
|
*(.data .data.*)
|
|
|
|
|
KEEP(*(SORT_BY_NAME(.sort.data.*)))
|
|
|
|
|
. += . > 0 ? 1 : 0;
|
|
|
|
|
|
|
|
|
|
KEEP(*(.gotprologue))
|
|
|
|
|
*(.got)
|
|
|
|
|
KEEP(*(.gotepilogue))
|
|
|
|
|
|
|
|
|
|
KEEP(*(.gotpltprologue))
|
|
|
|
|
*(.got.plt)
|
|
|
|
|
KEEP(*(.gotpltepilogue))
|
|
|
|
|
|
|
|
|
|
/*BEGIN: Post-Initialization Read-Only */
|
2021-02-08 17:19:00 +00:00
|
|
|
|
. = ALIGN(__SIZEOF_POINTER__);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
KEEP(*(SORT_BY_NAME(.piro.relo.sort.*)))
|
|
|
|
|
PROVIDE_HIDDEN(__relo_end = .);
|
2021-02-08 17:19:00 +00:00
|
|
|
|
. = ALIGN(__SIZEOF_POINTER__);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
KEEP(*(SORT_BY_NAME(.piro.data.sort.*)))
|
|
|
|
|
KEEP(*(.piro.pad.data))
|
2022-03-20 15:01:14 +00:00
|
|
|
|
KEEP(*(.dataepilogue))
|
|
|
|
|
/*END: NT FORK COPYING */
|
2020-06-15 14:18:57 +00:00
|
|
|
|
HIDDEN(_edata = .);
|
|
|
|
|
PROVIDE_HIDDEN(edata = .);
|
2022-05-27 20:25:46 +00:00
|
|
|
|
KEEP(*(SORT_BY_NAME(.zip.*)))
|
|
|
|
|
HIDDEN(_ezip = .);
|
2022-09-04 07:03:37 +00:00
|
|
|
|
. = ALIGN(PAGESIZE);
|
2021-02-08 17:19:00 +00:00
|
|
|
|
} :Ram
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
2022-05-27 20:25:46 +00:00
|
|
|
|
.tdata . : {
|
|
|
|
|
_tdata_start = .;
|
|
|
|
|
*(SORT_BY_ALIGNMENT(.tdata))
|
|
|
|
|
*(SORT_BY_ALIGNMENT(.tdata.*))
|
|
|
|
|
_tdata_end = .;
|
|
|
|
|
. = ALIGN(PAGESIZE);
|
2022-09-04 07:03:37 +00:00
|
|
|
|
} :Tls :Ram
|
2022-05-27 20:25:46 +00:00
|
|
|
|
|
2021-03-01 14:24:11 +00:00
|
|
|
|
/*END: file content that's loaded by o/s */
|
|
|
|
|
/*BEGIN: bss memory void */
|
|
|
|
|
|
2022-05-27 20:25:46 +00:00
|
|
|
|
.tbss . : {
|
|
|
|
|
_tbss_start = .;
|
|
|
|
|
*(SORT_BY_ALIGNMENT(.tbss))
|
|
|
|
|
*(SORT_BY_ALIGNMENT(.tbss.*))
|
2022-09-10 18:49:13 +00:00
|
|
|
|
. = ALIGN(TLS_ALIGNMENT);
|
2022-08-07 23:18:33 +00:00
|
|
|
|
/* the %fs register is based on this location */
|
2022-05-27 20:25:46 +00:00
|
|
|
|
_tbss_end = .;
|
|
|
|
|
} :Tls
|
2021-02-28 02:02:32 +00:00
|
|
|
|
|
2021-03-01 14:24:11 +00:00
|
|
|
|
/*END: file content */
|
|
|
|
|
/*BEGIN: bss memory that's addressable */
|
|
|
|
|
|
2021-07-06 02:10:06 +00:00
|
|
|
|
.bss ALIGN(64) : {
|
2022-03-20 15:01:14 +00:00
|
|
|
|
/*BEGIN: NT FORK COPYING */
|
|
|
|
|
KEEP(*(.bssprologue))
|
2020-06-15 14:18:57 +00:00
|
|
|
|
KEEP(*(SORT_BY_NAME(.piro.bss.init.*)))
|
|
|
|
|
*(.piro.bss)
|
|
|
|
|
KEEP(*(SORT_BY_NAME(.piro.bss.sort.*)))
|
|
|
|
|
HIDDEN(__piro_end = .);
|
2021-02-27 18:33:32 +00:00
|
|
|
|
. += . > 0 ? 1 : 0;
|
2020-06-15 14:18:57 +00:00
|
|
|
|
/*END: Post-Initialization Read-Only */
|
|
|
|
|
|
|
|
|
|
/* Statically Allocated Empty Space */
|
|
|
|
|
*(SORT_BY_ALIGNMENT(.bss))
|
|
|
|
|
*(SORT_BY_ALIGNMENT(.bss.*))
|
|
|
|
|
*(COMMON)
|
|
|
|
|
|
|
|
|
|
KEEP(*(SORT_BY_NAME(.sort.bss.*)))
|
|
|
|
|
|
2022-03-20 15:01:14 +00:00
|
|
|
|
KEEP(*(.bssepilogue))
|
|
|
|
|
/*END: NT FORK COPYING */
|
2021-02-27 18:33:32 +00:00
|
|
|
|
. = ALIGN(FRAMESIZE); /* for brk()/sbrk() allocation */
|
2020-06-15 14:18:57 +00:00
|
|
|
|
HIDDEN(_end = .);
|
|
|
|
|
PROVIDE_HIDDEN(end = .);
|
2022-05-27 20:25:46 +00:00
|
|
|
|
} :Bss
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
/*END: nt addressability guarantee */
|
|
|
|
|
/*END: bsd addressability guarantee */
|
|
|
|
|
/*END: linux addressability guarantee */
|
|
|
|
|
/*END: xnu addressability guarantee */
|
|
|
|
|
|
2021-02-08 17:19:00 +00:00
|
|
|
|
.shstrtab : { *(.shstrtab) }
|
|
|
|
|
.strtab : { *(.strtab) }
|
|
|
|
|
.symtab : { *(.symtab) }
|
2020-08-25 11:23:25 +00:00
|
|
|
|
.stab 0 : { *(.stab) }
|
|
|
|
|
.stabstr 0 : { *(.stabstr) }
|
|
|
|
|
.stab.excl 0 : { *(.stab.excl) }
|
|
|
|
|
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
|
|
|
.stab.index 0 : { *(.stab.index) }
|
|
|
|
|
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
|
|
|
.comment 0 : { *(.comment) }
|
|
|
|
|
.debug 0 : { *(.debug) }
|
|
|
|
|
.line 0 : { *(.line) }
|
|
|
|
|
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
|
|
|
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
|
|
|
.debug_aranges 0 : { *(.debug_aranges) }
|
|
|
|
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
|
|
|
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
|
|
|
|
|
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
|
|
|
.debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) }
|
|
|
|
|
.debug_frame 0 : { *(.debug_frame) }
|
|
|
|
|
.debug_str 0 : { *(.debug_str) }
|
|
|
|
|
.debug_loc 0 : { *(.debug_loc) }
|
|
|
|
|
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
|
|
|
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
|
|
|
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
|
|
|
.debug_typenames 0 : { *(.debug_typenames) }
|
|
|
|
|
.debug_varnames 0 : { *(.debug_varnames) }
|
|
|
|
|
.debug_pubtypes 0 : { *(.debug_pubtypes) }
|
|
|
|
|
.debug_ranges 0 : { *(.debug_ranges) }
|
|
|
|
|
.debug_macro 0 : { *(.debug_macro) }
|
|
|
|
|
.debug_addr 0 : { *(.debug_addr) }
|
|
|
|
|
.gnu.attributes 0 : { KEEP(*(.gnu.attributes)) }
|
|
|
|
|
.GCC.command.line 0 : { *(.GCC.command.line) }
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
/DISCARD/ : {
|
2021-02-08 17:19:00 +00:00
|
|
|
|
*(__mcount_loc)
|
2020-06-15 14:18:57 +00:00
|
|
|
|
*(.discard)
|
|
|
|
|
*(.yoink)
|
|
|
|
|
*(.*)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-08 17:19:00 +00:00
|
|
|
|
PFSTUB8(ape_elf_entry, _start);
|
|
|
|
|
PFSTUB8(ape_elf_phoff, RVA(ape_phdrs));
|
|
|
|
|
PFSTUB8(ape_elf_shoff, 0);
|
|
|
|
|
PFSTUB4(ape_elf_phnum, (ape_phdrs_end - ape_phdrs) / 56);
|
|
|
|
|
PFSTUB4(ape_elf_shnum, 0);
|
|
|
|
|
PFSTUB4(ape_elf_shstrndx, 0);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
2022-05-27 20:25:46 +00:00
|
|
|
|
HIDDEN(_tls_size = _tbss_end - _tdata_start);
|
2022-09-10 18:49:13 +00:00
|
|
|
|
HIDDEN(_tdata_size = _tdata_end - _tdata_start);
|
|
|
|
|
HIDDEN(_tbss_size = _tbss_end - _tbss_start);
|
|
|
|
|
HIDDEN(_tbss_offset = _tbss_start - _tdata_start);
|
2022-07-10 15:27:50 +00:00
|
|
|
|
HIDDEN(_tls_content = (_tdata_end - _tdata_start) + (_tbss_end - _tbss_start));
|
2022-05-27 20:25:46 +00:00
|
|
|
|
|
2022-03-20 15:01:14 +00:00
|
|
|
|
HIDDEN(__privileged_addr = ROUNDDOWN(__privileged_start, PAGESIZE));
|
2021-02-06 11:17:41 +00:00
|
|
|
|
HIDDEN(__privileged_size = (ROUNDUP(__privileged_end, PAGESIZE) -
|
2022-03-20 15:01:14 +00:00
|
|
|
|
ROUNDDOWN(__privileged_start, PAGESIZE)));
|
2021-02-03 04:21:06 +00:00
|
|
|
|
|
2021-02-08 17:19:00 +00:00
|
|
|
|
HIDDEN(ape_rom_offset = 0);
|
|
|
|
|
HIDDEN(ape_rom_vaddr = ADDR(.head));
|
|
|
|
|
HIDDEN(ape_rom_paddr = LOADADDR(.head));
|
|
|
|
|
HIDDEN(ape_rom_filesz = LOADADDR(.data) - ape_rom_paddr);
|
|
|
|
|
HIDDEN(ape_rom_memsz = ADDR(.data) - ADDR(.head));
|
|
|
|
|
HIDDEN(ape_rom_align = PAGESIZE);
|
|
|
|
|
HIDDEN(ape_rom_rva = RVA(ape_rom_vaddr));
|
|
|
|
|
|
|
|
|
|
HIDDEN(ape_ram_offset = ape_rom_offset + ape_rom_filesz);
|
|
|
|
|
HIDDEN(ape_ram_vaddr = ADDR(.data));
|
|
|
|
|
HIDDEN(ape_ram_paddr = LOADADDR(.data));
|
2022-05-27 20:25:46 +00:00
|
|
|
|
HIDDEN(ape_ram_filesz = SIZEOF(.data) + SIZEOF(.tdata));
|
2021-02-08 17:19:00 +00:00
|
|
|
|
HIDDEN(ape_ram_memsz = ADDR(.bss) + SIZEOF(.bss) - ape_ram_vaddr);
|
|
|
|
|
HIDDEN(ape_ram_align = PAGESIZE);
|
|
|
|
|
HIDDEN(ape_ram_rva = RVA(ape_ram_vaddr));
|
|
|
|
|
|
2022-04-13 05:11:00 +00:00
|
|
|
|
HIDDEN(ape_stack_pf = DEFINED(ape_stack_pf) ? ape_stack_pf : PF_R | PF_W);
|
|
|
|
|
HIDDEN(ape_stack_prot = _PF2PROT(ape_stack_pf));
|
2021-02-24 04:23:19 +00:00
|
|
|
|
HIDDEN(ape_stack_offset = ape_ram_offset + ape_ram_filesz);
|
2022-05-19 23:57:49 +00:00
|
|
|
|
HIDDEN(ape_stack_vaddr = DEFINED(ape_stack_vaddr) ? ape_stack_vaddr : 0x700000000000);
|
2021-02-24 04:23:19 +00:00
|
|
|
|
HIDDEN(ape_stack_paddr = ape_ram_paddr + ape_ram_filesz);
|
|
|
|
|
HIDDEN(ape_stack_filesz = 0);
|
2021-10-14 00:27:13 +00:00
|
|
|
|
HIDDEN(ape_stack_memsz = DEFINED(ape_stack_memsz) ? ape_stack_memsz : STACKSIZE);
|
2021-02-24 04:23:19 +00:00
|
|
|
|
HIDDEN(ape_stack_align = 16);
|
|
|
|
|
|
2021-02-08 17:19:00 +00:00
|
|
|
|
HIDDEN(ape_note_offset = ape_rom_offset + (ape_note - ape_rom_vaddr));
|
|
|
|
|
HIDDEN(ape_note_vaddr = ape_note);
|
|
|
|
|
HIDDEN(ape_note_paddr = ape_rom_paddr + ape_note_offset);
|
|
|
|
|
HIDDEN(ape_note_filesz = ape_note_end - ape_note);
|
|
|
|
|
HIDDEN(ape_note_memsz = ape_note_filesz);
|
|
|
|
|
HIDDEN(ape_note_align = __SIZEOF_POINTER__);
|
|
|
|
|
|
|
|
|
|
HIDDEN(ape_text_offset = ape_rom_offset + LOADADDR(.text) - ape_rom_paddr);
|
|
|
|
|
HIDDEN(ape_text_paddr = LOADADDR(.text));
|
|
|
|
|
HIDDEN(ape_text_vaddr = ADDR(.text));
|
|
|
|
|
HIDDEN(ape_text_filesz = SIZEOF(.text));
|
|
|
|
|
HIDDEN(ape_text_memsz = SIZEOF(.text));
|
|
|
|
|
HIDDEN(ape_text_align = PAGESIZE);
|
|
|
|
|
HIDDEN(ape_text_rva = RVA(ape_text_vaddr));
|
|
|
|
|
|
|
|
|
|
HIDDEN(ape_data_offset = ape_ram_offset + LOADADDR(.data) - ape_ram_paddr);
|
|
|
|
|
HIDDEN(ape_data_paddr = LOADADDR(.data));
|
|
|
|
|
HIDDEN(ape_data_vaddr = ADDR(.data));
|
2022-05-28 12:50:01 +00:00
|
|
|
|
HIDDEN(ape_data_filesz = SIZEOF(.data) + SIZEOF(.tdata));
|
|
|
|
|
HIDDEN(ape_data_memsz = SIZEOF(.data) + SIZEOF(.tdata));
|
2021-02-08 17:19:00 +00:00
|
|
|
|
HIDDEN(ape_data_align = PAGESIZE);
|
|
|
|
|
HIDDEN(ape_data_rva = RVA(ape_data_vaddr));
|
|
|
|
|
|
|
|
|
|
HIDDEN(ape_bss_offset = ape_ram_offset + LOADADDR(.bss) - ape_ram_paddr);
|
|
|
|
|
HIDDEN(ape_bss_paddr = LOADADDR(.bss));
|
|
|
|
|
HIDDEN(ape_bss_vaddr = ADDR(.bss));
|
|
|
|
|
HIDDEN(ape_bss_filesz = 0);
|
|
|
|
|
HIDDEN(ape_bss_memsz = SIZEOF(.bss));
|
|
|
|
|
HIDDEN(ape_bss_align = PAGESIZE);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
2022-05-22 11:51:02 +00:00
|
|
|
|
/* we roundup here because xnu wants the file load segments page-aligned */
|
|
|
|
|
/* but we don't want to add the nop padding to the ape program, so we'll */
|
|
|
|
|
/* let ape.S dd read past the end of the file into the wrapping binaries */
|
|
|
|
|
SHSTUB2(ape_loader_dd_skip, DEFINED(ape_loader) ? RVA(ape_loader) / 64 : 0);
|
|
|
|
|
SHSTUB2(ape_loader_dd_count,
|
|
|
|
|
DEFINED(ape_loader_end)
|
|
|
|
|
? ROUNDUP(ape_loader_end - ape_loader, PAGESIZE) / 64
|
|
|
|
|
: 0);
|
2022-05-21 14:52:58 +00:00
|
|
|
|
|
2021-02-08 12:04:42 +00:00
|
|
|
|
#if SupportsMetal()
|
2020-06-15 14:18:57 +00:00
|
|
|
|
HIDDEN(v_ape_realsectors =
|
2021-02-24 04:23:19 +00:00
|
|
|
|
MIN(0x70000 - IMAGE_BASE_REAL,
|
2020-11-09 23:41:11 +00:00
|
|
|
|
ROUNDUP(RVA(_edata), 4096)) / 512);
|
2022-09-04 07:19:08 +00:00
|
|
|
|
HIDDEN(v_ape_realslacksectors =
|
|
|
|
|
v_ape_realsectors - MIN(0x70000 - IMAGE_BASE_REAL,
|
|
|
|
|
ROUNDUP(RVA(_edata), 512)) / 512);
|
2020-11-09 23:41:11 +00:00
|
|
|
|
HIDDEN(v_ape_realpages = v_ape_realsectors / (4096 / 512));
|
2020-06-15 14:18:57 +00:00
|
|
|
|
HIDDEN(v_ape_highsectors =
|
|
|
|
|
(ROUNDUP(RVA(_edata), 512) / 512) - v_ape_realsectors);
|
2021-02-08 12:04:42 +00:00
|
|
|
|
#endif
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
|
|
/* ZIP End of Central Directory header */
|
|
|
|
|
#define ZIPCONST(NAME, VAL) HIDDEN(NAME = DEFINED(__zip_start) ? VAL : 0);
|
|
|
|
|
ZIPCONST(v_zip_cdoffset, __zip_start - IMAGE_BASE_VIRTUAL);
|
|
|
|
|
ZIPCONST(v_zip_cdirsize, __zip_end - __zip_start);
|
2021-03-01 14:24:11 +00:00
|
|
|
|
ASSERT(v_zip_cdirsize % kZipCdirHdrLinkableSize == 0, "bad zip cdir");
|
2020-06-15 14:18:57 +00:00
|
|
|
|
ZIPCONST(v_zip_records, v_zip_cdirsize / kZipCdirHdrLinkableSize);
|
2021-03-01 14:24:11 +00:00
|
|
|
|
ZIPCONST(v_zip_commentsize, _ezip - __zip_end - kZipCdirHdrMinSize);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
2021-02-08 12:04:42 +00:00
|
|
|
|
#if SupportsXnu()
|
|
|
|
|
/* Generates deterministic ID. */
|
2020-06-15 14:18:57 +00:00
|
|
|
|
#define PHI 0x9e3779b9925d4c17
|
|
|
|
|
#define XOR(X,Y) ((X | Y) - (X & Y))
|
|
|
|
|
#define XORSHIFT(X,Y) \
|
|
|
|
|
X = XOR(X, (Y >> 12)); \
|
|
|
|
|
X = XOR(X, (Y << 25)); \
|
|
|
|
|
X = XOR(X, (Y >> 27))
|
|
|
|
|
#define KMH(X,Y) \
|
|
|
|
|
X = (X + (Y >> 000) & 0xFF) * PHI; \
|
|
|
|
|
X = (X + (Y >> 010) & 0xFF) * PHI; \
|
|
|
|
|
X = (X + (Y >> 020) & 0xFF) * PHI; \
|
|
|
|
|
X = (X + (Y >> 030) & 0xFF) * PHI
|
2020-06-16 02:01:28 +00:00
|
|
|
|
#define CHURN(X) \
|
2021-02-08 17:19:00 +00:00
|
|
|
|
XORSHIFT(ape_uuid1, X); \
|
|
|
|
|
KMH(ape_uuid1, X); \
|
|
|
|
|
XORSHIFT(ape_uuid2, X); \
|
|
|
|
|
KMH(ape_uuid2, X)
|
|
|
|
|
HIDDEN(ape_uuid1 = 88172645463325252);
|
|
|
|
|
HIDDEN(ape_uuid2 = 88172645463325252);
|
|
|
|
|
CHURN(ape_bss_align);
|
|
|
|
|
CHURN(ape_bss_filesz);
|
|
|
|
|
CHURN(ape_bss_memsz);
|
|
|
|
|
CHURN(ape_bss_offset);
|
|
|
|
|
CHURN(ape_bss_paddr);
|
|
|
|
|
CHURN(ape_data_filesz);
|
|
|
|
|
CHURN(ape_data_memsz);
|
|
|
|
|
CHURN(ape_data_offset);
|
|
|
|
|
CHURN(ape_data_paddr);
|
|
|
|
|
CHURN(ape_data_rva);
|
|
|
|
|
CHURN(ape_data_vaddr);
|
|
|
|
|
CHURN(ape_elf_entry);
|
|
|
|
|
CHURN(ape_elf_phnum);
|
|
|
|
|
CHURN(ape_elf_phoff);
|
|
|
|
|
CHURN(ape_elf_shnum);
|
|
|
|
|
CHURN(ape_elf_shoff);
|
|
|
|
|
CHURN(ape_elf_shstrndx);
|
|
|
|
|
CHURN(ape_macho_end);
|
|
|
|
|
CHURN(ape_note);
|
|
|
|
|
CHURN(ape_note_align);
|
|
|
|
|
CHURN(ape_note_end);
|
|
|
|
|
CHURN(ape_note_filesz);
|
|
|
|
|
CHURN(ape_note_memsz);
|
|
|
|
|
CHURN(ape_note_offset);
|
|
|
|
|
CHURN(ape_note_paddr);
|
|
|
|
|
CHURN(ape_note_vaddr);
|
|
|
|
|
CHURN(ape_ram_align);
|
|
|
|
|
CHURN(ape_ram_filesz);
|
|
|
|
|
CHURN(ape_ram_memsz);
|
|
|
|
|
CHURN(ape_ram_offset);
|
|
|
|
|
CHURN(ape_ram_paddr);
|
|
|
|
|
CHURN(ape_ram_rva);
|
|
|
|
|
CHURN(ape_ram_vaddr);
|
|
|
|
|
CHURN(ape_rom_align);
|
|
|
|
|
CHURN(ape_rom_filesz);
|
|
|
|
|
CHURN(ape_rom_memsz);
|
|
|
|
|
CHURN(ape_rom_offset);
|
|
|
|
|
CHURN(ape_rom_paddr);
|
|
|
|
|
CHURN(ape_rom_rva);
|
|
|
|
|
CHURN(ape_rom_vaddr);
|
|
|
|
|
CHURN(ape_text_align);
|
|
|
|
|
CHURN(ape_text_filesz);
|
|
|
|
|
CHURN(ape_text_memsz);
|
|
|
|
|
CHURN(ape_text_offset);
|
|
|
|
|
CHURN(ape_text_paddr);
|
|
|
|
|
CHURN(ape_text_rva);
|
|
|
|
|
CHURN(ape_text_vaddr);
|
2020-06-16 02:01:28 +00:00
|
|
|
|
CHURN(ADDR(.bss));
|
|
|
|
|
CHURN(_start);
|
2021-02-08 17:19:00 +00:00
|
|
|
|
CHURN(ape_phdrs);
|
2021-02-08 12:04:42 +00:00
|
|
|
|
#if SupportsMetal()
|
|
|
|
|
CHURN(v_ape_realsectors);
|
|
|
|
|
#endif
|
|
|
|
|
#if SupportsXnu()
|
2021-02-08 17:19:00 +00:00
|
|
|
|
CHURN(ape_macho);
|
2021-02-08 12:04:42 +00:00
|
|
|
|
#endif
|
2021-02-24 04:23:19 +00:00
|
|
|
|
#if SupportsWindows() || SupportsMetal()
|
2021-02-08 17:19:00 +00:00
|
|
|
|
CHURN(ape_mz);
|
|
|
|
|
CHURN(ape_pe);
|
|
|
|
|
CHURN(ape_pe_offset);
|
|
|
|
|
CHURN(ape_pe_optsz);
|
|
|
|
|
CHURN(ape_pe_sections);
|
|
|
|
|
CHURN(ape_pe_sections_end);
|
|
|
|
|
CHURN(ape_pe_shnum);
|
|
|
|
|
CHURN(ape_phdrs_end);
|
2021-02-08 12:04:42 +00:00
|
|
|
|
CHURN(WinMain);
|
|
|
|
|
#endif /* SupportsWindows() */
|
|
|
|
|
#endif /* SupportsXnu() */
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
2022-06-20 11:32:25 +00:00
|
|
|
|
#if SupportsWindows() || SupportsMetal()
|
|
|
|
|
#define LINK_WINDOWS (SupportsWindows() && !DEFINED(EfiMain))
|
|
|
|
|
PFSTUB4(ape_pe_offset, ape_pe - ape_mz);
|
|
|
|
|
HIDDEN(ape_pe_optsz = ape_pe_sections - (ape_pe + 24));
|
|
|
|
|
HIDDEN(ape_pe_shnum = (ape_pe_sections_end - ape_pe_sections) / 40);
|
|
|
|
|
HIDDEN(ape_pe_base = IMAGE_BASE_VIRTUAL);
|
|
|
|
|
HIDDEN(ape_idata = LINK_WINDOWS ? RVA(ape_idata_iat) : 0);
|
|
|
|
|
HIDDEN(ape_idata_iatsize = LINK_WINDOWS ? ape_idata_iatend - ape_idata_iat : 0);
|
|
|
|
|
HIDDEN(ape_idata = LINK_WINDOWS ? RVA(ape_idata_idt) : 0);
|
|
|
|
|
HIDDEN(ape_idata_idtsize = LINK_WINDOWS ? ape_idata_idtend - ape_idata_idt : 0);
|
|
|
|
|
HIDDEN(v_ntversion = LINK_WINDOWS ? 6 : 1);
|
|
|
|
|
HIDDEN(v_ntdllchar = LINK_WINDOWS ? 288 : 0);
|
|
|
|
|
HIDDEN(v_ntsubversion = LINK_WINDOWS ? 6 : 5);
|
|
|
|
|
HIDDEN(v_ntsubsystem = (LINK_WINDOWS
|
|
|
|
|
? (DEFINED(GetMessage)
|
|
|
|
|
? kNtImageSubsystemWindowsGui
|
|
|
|
|
: kNtImageSubsystemWindowsCui)
|
|
|
|
|
: kNtImageSubsystemEfiApplication));
|
|
|
|
|
HIDDEN(ape_pe_entry = LINK_WINDOWS ? WinMain : EfiMain);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if SupportsXnu()
|
|
|
|
|
SHSTUB2(ape_macho_dd_skip, RVA(ape_macho) / 8);
|
|
|
|
|
SHSTUB2(ape_macho_dd_count, (ape_macho_end - ape_macho) / 8);
|
|
|
|
|
#endif
|
|
|
|
|
|
2021-02-08 17:19:00 +00:00
|
|
|
|
ASSERT(DEFINED(ape_mz) ? ape_mz == IMAGE_BASE_VIRTUAL : 1, "linker panic");
|
2020-06-15 14:18:57 +00:00
|
|
|
|
ASSERT((DEFINED(__init_bss_end) ? __init_bss_end : 0) % __SIZEOF_POINTER__ == 0,
|
|
|
|
|
"__init_bss misalign");
|
|
|
|
|
ASSERT(((DEFINED(__init_rodata_end) ? __init_rodata_end : 0) %
|
|
|
|
|
__SIZEOF_POINTER__ == 0),
|
|
|
|
|
"__init_rodata misalign");
|
|
|
|
|
|
2021-02-08 17:19:00 +00:00
|
|
|
|
ASSERT((!DEFINED(ape_grub) ? 1 : RVA(ape_grub) < 8192),
|
2020-06-15 14:18:57 +00:00
|
|
|
|
"grub stub needs to be in first 8kb of image");
|
|
|
|
|
|
|
|
|
|
ASSERT(DEFINED(_start) || DEFINED(_start16),
|
|
|
|
|
"please link a _start() or _start16() entrypoint");
|
|
|
|
|
|
|
|
|
|
ASSERT(!DEFINED(_start16) || REAL(_end) < 65536,
|
|
|
|
|
"ape won't support non-tiny real mode programs");
|
|
|
|
|
|
2022-05-19 23:57:49 +00:00
|
|
|
|
ASSERT(IS2POW(ape_stack_memsz),
|
|
|
|
|
"ape_stack_memsz must be a two power");
|
|
|
|
|
|
2022-09-12 11:19:32 +00:00
|
|
|
|
ASSERT(ape_stack_vaddr % ape_stack_memsz == 0,
|
|
|
|
|
"ape_stack_vaddr must have ape_stack_memsz alignment; try using STATIC_STACK_ADDR(0x700000040000 - ape_stack_memsz);");
|
2022-05-19 23:57:49 +00:00
|
|
|
|
|
2022-09-10 18:49:13 +00:00
|
|
|
|
ASSERT(ALIGNOF(.tdata) <= TLS_ALIGNMENT && ALIGNOF(.tbss) <= TLS_ALIGNMENT,
|
|
|
|
|
"_Thread_local _Alignof can't exceed TLS_ALIGNMENT");
|
|
|
|
|
|
2020-06-15 14:18:57 +00:00
|
|
|
|
/* Let's not be like Knight Capital. */
|
|
|
|
|
/* NOCROSSREFS_TO(.test .text) */
|
|
|
|
|
|
2021-02-08 17:19:00 +00:00
|
|
|
|
/* ASSERT(ape_sysv_start == ape_text_vaddr, */
|
2020-06-15 14:18:57 +00:00
|
|
|
|
/* "ape_sysv_start() must be first in .text"); */
|
|
|
|
|
|
|
|
|
|
#endif /* __LINKER__ */
|