Moved loader into its own .payload section

This commit is contained in:
Lemaitre 2021-09-17 23:10:12 +02:00
parent 2c0ad922d5
commit 892d201e12
2 changed files with 18 additions and 33 deletions

View file

@ -543,23 +543,21 @@ apesh: .ascii "'\n#'\"\n" # sixth edition shebang
.ascii "o=\"$(command -v \"$0\")\"\n"
// Try to use a system-wide APE loader.
.ascii "type ape-loader >/dev/null 2>&1 && "
.ascii "exec ape-loader \"$0\" \"$@\"\n"
.ascii "exec ape-loader \"$o\" \"$@\"\n"
#ifdef APE_LOADER
// There is no system-wide APE loader, but there is one
// embedded inside the APE. So if the system is not MacOs,
// extract the loader into a temp folder, and use it to
// load the APE without modifying it.
.ascii "if [ ! -d /Applications ]; then\n"
.ascii "t=\"${TMPDIR:-/tmp}/ape-loader.$$\"\n"
.ascii "dd if=\"$o\" of=\"$t\" skip=\""
.ascii "t=\"${TMPDIR:-/tmp}/ape-loader\"\n"
.ascii "[ -x \"$t\" ] || {\ndd if=\"$o\" of=\"$t\" skip=\""
.shstub ape_loader_dd_skip,2
.ascii "\" count=\""
.shstub ape_loader_dd_count,2
.ascii "\" bs=\""
.shstub ape_loader_dd_bs,2
.ascii "\" 2>/dev/null\n"
.ascii "chmod 700 \"$t\"\n"
.ascii "exec \"$t\" \"$0\" \"$@\"\n"
.ascii "\" bs=64 2>/dev/null &&\n"
.ascii "chmod 700 \"$t\"\n}\n"
.ascii "exec \"$t\" \"$o\" \"$@\"\n"
.ascii "fi\n"
#endif
#ifndef APE_NO_MODIFY_SELF

View file

@ -204,13 +204,6 @@ SECTIONS {
KEEP(*(.apesh))
KEEP(*(.head2))
KEEP(*(.text.head))
/* Loader */
. = ALIGN(64);
HIDDEN(ape_loader = .);
KEEP(*(.ape.loader))
. = ALIGN(64);
HIDDEN(ape_loader_end = .);
/* Executable & Linkable Format */
. = ALIGN(__SIZEOF_POINTER__);
@ -374,6 +367,15 @@ SECTIONS {
} :Ram
/*END: file content that's loaded by o/s */
/*BEGIN: payload (for now, only the APE loader) */
.payload ALIGN(64) : {
/* Loader */
HIDDEN(ape_loader = .);
KEEP(*(.ape.loader))
. = ALIGN(64);
HIDDEN(ape_loader_end = .);
}
/*END: payload */
/*BEGIN: bss memory void */
.zip . : {
@ -485,17 +487,6 @@ HIDDEN(ape_stack_filesz = 0);
HIDDEN(ape_stack_memsz = STACKSIZE);
HIDDEN(ape_stack_align = 16);
HIDDEN(ape_loader_offset = ape_rom_offset + ape_loader - ape_rom_vaddr);
HIDDEN(ape_loader_vaddr = ape_loader);
HIDDEN(ape_loader_paddr = ape_rom_paddr + ape_loader_offset);
HIDDEN(ape_loader_filesz = ape_loader_end - ape_loader);
HIDDEN(ape_loader_memsz = ape_loader_filesz);
HIDDEN(ape_loader_align = 64);
HIDDEN(ape_loader_rva = RVA(ape_loader_vaddr));
SHSTUB2(ape_loader_dd_bs, ape_loader_align);
SHSTUB2(ape_loader_dd_skip, ape_loader_rva / ape_loader_align);
SHSTUB2(ape_loader_dd_count, ape_loader_filesz / ape_loader_align);
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);
@ -526,6 +517,9 @@ HIDDEN(ape_bss_filesz = 0);
HIDDEN(ape_bss_memsz = SIZEOF(.bss));
HIDDEN(ape_bss_align = PAGESIZE);
SHSTUB2(ape_loader_dd_skip, RVA(ape_loader) / 64);
SHSTUB2(ape_loader_dd_count, (ape_loader_end - ape_loader) / 64);
#if SupportsXnu()
SHSTUB2(ape_macho_dd_skip, RVA(ape_macho) / 8);
SHSTUB2(ape_macho_dd_count, (ape_macho_end - ape_macho) / 8);
@ -607,13 +601,6 @@ CHURN(ape_elf_shnum);
CHURN(ape_elf_shoff);
CHURN(ape_elf_shstrndx);
CHURN(ape_macho_end);
CHURN(ape_loader_offset);
CHURN(ape_loader_vaddr);
CHURN(ape_loader_paddr);
CHURN(ape_loader_filesz);
CHURN(ape_loader_memsz);
CHURN(ape_loader_align);
CHURN(ape_loader_rva);
CHURN(ape_note);
CHURN(ape_note_align);
CHURN(ape_note_end);