diff --git a/ape/ape.S b/ape/ape.S index c22c0fcd9..85a468837 100644 --- a/ape/ape.S +++ b/ape/ape.S @@ -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 diff --git a/ape/ape.lds b/ape/ape.lds index 06ef7bad3..a87f3655c 100644 --- a/ape/ape.lds +++ b/ape/ape.lds @@ -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);