mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-02 17:28:30 +00:00
Make minor improvements
- Work towards simplifying ape.S startup process - Rewrote ar because it took minutes to build cosmopolitan.a
This commit is contained in:
parent
95bc650be8
commit
aea89fe832
70 changed files with 1037 additions and 456 deletions
|
@ -38,8 +38,8 @@ static textwindows struct DirectMap DirectMapNt(void *addr, size_t size,
|
|||
protect = prot2nt(prot, flags);
|
||||
access = fprot2nt(prot, flags);
|
||||
if ((res.maphandle =
|
||||
CreateFileMappingNuma(handle, &kNtIsInheritable, protect, size >> 32,
|
||||
size, NULL, kNtNumaNoPreferredNode))) {
|
||||
CreateFileMappingNuma(handle, NULL, protect, size >> 32, size, NULL,
|
||||
kNtNumaNoPreferredNode))) {
|
||||
if (!(res.addr = MapViewOfFileExNuma(res.maphandle, access, off >> 32, off,
|
||||
size, addr, kNtNumaNoPreferredNode))) {
|
||||
CloseHandle(res.maphandle);
|
||||
|
|
|
@ -42,16 +42,13 @@ _executive:
|
|||
mov %rdx,%r14
|
||||
mov %rcx,%r15
|
||||
call _spawn
|
||||
call _getstack
|
||||
mov %rax,%rdi
|
||||
mov %r12d,%edi
|
||||
mov %r13,%rsi
|
||||
mov %r14,%rdx
|
||||
mov %r15,%rcx
|
||||
.weak main
|
||||
mov $main,%esi
|
||||
mov %r12,%rdx
|
||||
mov %r13,%rcx
|
||||
mov %r14,%r8
|
||||
mov %r15,%r9
|
||||
call _setstack
|
||||
mov %eax,%edi
|
||||
call main
|
||||
xchg %eax,%edi
|
||||
call exit
|
||||
.endfn _executive,weak,hidden
|
||||
ud2
|
||||
|
|
|
@ -1,36 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ This program is free software; you can redistribute it and/or modify │
|
||||
│ it under the terms of the GNU General Public License as published by │
|
||||
│ the Free Software Foundation; version 2 of the License. │
|
||||
│ │
|
||||
│ This program is distributed in the hope that it will be useful, but │
|
||||
│ WITHOUT ANY WARRANTY; without even the implied warranty of │
|
||||
│ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU │
|
||||
│ General Public License for more details. │
|
||||
│ │
|
||||
│ You should have received a copy of the GNU General Public License │
|
||||
│ along with this program; if not, write to the Free Software │
|
||||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/sysv/consts/map.h"
|
||||
#include "libc/sysv/consts/prot.h"
|
||||
|
||||
/**
|
||||
* Allocates deterministic stack for process.
|
||||
* @see _executive()
|
||||
*/
|
||||
void *_getstack(void) {
|
||||
char *p;
|
||||
p = mmap((char *)0x700000000000 /* IMAGE_BASE_VIRTUAL */ - STACKSIZE,
|
||||
STACKSIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
if (p == MAP_FAILED) abort();
|
||||
return p + STACKSIZE;
|
||||
}
|
|
@ -25,6 +25,7 @@ void *__cxa_finalize(void *) hidden;
|
|||
void _executive(int, char **, char **, long (*)[2]) hidden noreturn;
|
||||
void __stack_chk_fail(void) noreturn relegated;
|
||||
void __stack_chk_fail_local(void) noreturn relegated hidden;
|
||||
long _setstack(void *, void *, ...) hidden;
|
||||
int GetDosArgv(const char16_t *, char *, size_t, char **, size_t) hidden;
|
||||
|
||||
forceinline void AssertNeverCalledWhileTerminating(void) {
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include "libc/runtime/ezmap.h"
|
||||
|
||||
Elf64_Ehdr *mapelfread(const char *filename, struct MappedFile *mf) {
|
||||
if (mapfileread(filename, mf) != -1 && iself64binary(mf->addr, mf->size)) {
|
||||
if (mapfileread(filename, mf) != -1 && IsElf64Binary(mf->addr, mf->size)) {
|
||||
return mf->addr;
|
||||
} else {
|
||||
unmapfile(mf);
|
||||
|
|
|
@ -27,7 +27,9 @@
|
|||
/**
|
||||
* Synchronize memory mapping changes to disk.
|
||||
*
|
||||
* @param flags needs MS_SYNC or MS_ASYNC and can have MS_INVALIDATE
|
||||
* Without this, there's no guarantee memory is written back to disk.
|
||||
*
|
||||
* @param flags needs MS_ASYNC or MS_SYNC and can have MS_INVALIDATE
|
||||
* @return 0 on success or -1 w/ errno
|
||||
*/
|
||||
int msync(void *addr, size_t size, int flags) {
|
||||
|
|
|
@ -39,8 +39,8 @@ struct SymbolTable *OpenSymbolTable(const char *filename) {
|
|||
t = MAP_FAILED;
|
||||
if (filename && (t = mapanon(BIGPAGESIZE)) != MAP_FAILED &&
|
||||
mapelfread(filename, &t->mf) &&
|
||||
(t->name_base = getelfstringtable(t->elf, t->elfsize)) != NULL &&
|
||||
(symtab = getelfsymboltable(t->elf, t->elfsize, &t->count)) &&
|
||||
(t->name_base = GetElfStringTable(t->elf, t->elfsize)) != NULL &&
|
||||
(symtab = GetElfSymbolTable(t->elf, t->elfsize, &t->count)) &&
|
||||
sizeof(struct SymbolTable) + sizeof(struct Symbol) * t->count <
|
||||
(t->scratch = BIGPAGESIZE)) {
|
||||
getelfvirtualaddressrange(t->elf, t->elfsize, &t->addr_base, &t->addr_end);
|
||||
|
|
|
@ -43,7 +43,6 @@ void longjmp(jmp_buf, int) libcesque noreturn paramsnonnull();
|
|||
void exit(int) noreturn;
|
||||
void _exit(int) libcesque noreturn;
|
||||
void _Exit(int) libcesque noreturn;
|
||||
long _setstack(void *, void *, ...);
|
||||
void abort(void) noreturn noinstrument;
|
||||
void panic(void) noreturn noinstrument privileged;
|
||||
void triplf(void) noreturn noinstrument privileged;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
/ @param rdi is new rsp, passed as malloc(size) + size
|
||||
/ @param rsi is function to call in new stack space
|
||||
/ @param rdx,rcx,r8,r9 get passed as args to rsi
|
||||
/ @return happens on original stack
|
||||
/ @return rax and happens on original stack
|
||||
_setstack:
|
||||
push %rbp
|
||||
mov %rsp,%rbp
|
||||
|
@ -43,4 +43,4 @@ _setstack:
|
|||
pop %rbx
|
||||
pop %rbp
|
||||
ret
|
||||
.endfn _setstack,globl
|
||||
.endfn _setstack,globl,hidden
|
||||
|
|
|
@ -25,7 +25,9 @@
|
|||
#include "libc/nt/enum/consolemodeflags.h"
|
||||
#include "libc/nt/enum/filetype.h"
|
||||
#include "libc/nt/enum/loadlibrarysearch.h"
|
||||
#include "libc/nt/enum/pageflags.h"
|
||||
#include "libc/nt/files.h"
|
||||
#include "libc/nt/memory.h"
|
||||
#include "libc/nt/pedef.h"
|
||||
#include "libc/nt/process.h"
|
||||
#include "libc/nt/runtime.h"
|
||||
|
@ -117,10 +119,10 @@ static textwindows void NormalizeCmdExe(void) {
|
|||
* 3. Environment variables are passed to us as a sorted UTF-16 double
|
||||
* NUL terminated list. We translate this to char ** using UTF-8.
|
||||
*
|
||||
* 4. NT likes to choose a stack address that's beneath the program
|
||||
* image. We want to be able to assume that stack addresses are
|
||||
* located at higher addresses than heap and program memory. So the
|
||||
* _executive() function will switch stacks appropriately.
|
||||
* 4. Allocates new stack at a high address. NT likes to choose a
|
||||
* stack address that's beneath the program image. We want to be
|
||||
* able to assume that stack addresses are located at higher
|
||||
* addresses than heap and program memory.
|
||||
*
|
||||
* 5. Windows users are afraid of "drive-by downloads" where someone
|
||||
* might accidentally an evil DLL to their Downloads folder which
|
||||
|
@ -131,21 +133,27 @@ static textwindows void NormalizeCmdExe(void) {
|
|||
*/
|
||||
textwindows int WinMain(void *hInstance, void *hPrevInstance,
|
||||
const char *lpCmdLine, int nCmdShow) {
|
||||
char *stack;
|
||||
int i, count;
|
||||
const char16_t *cmd16, *env16;
|
||||
char *argarray[512], *envarray[512];
|
||||
char *argv[512], *envp[512];
|
||||
char argblock[ARG_MAX], envblock[ENV_MAX];
|
||||
long auxarray[][2] = {{pushpop(0L), pushpop(0L)}};
|
||||
long auxv[][2] = {{pushpop(0L), pushpop(0L)}};
|
||||
MitigateDriveByDownloads();
|
||||
NormalizeCmdExe();
|
||||
*(/*unconst*/ int *)&hostos = WINDOWS;
|
||||
cmd16 = GetCommandLine();
|
||||
env16 = GetEnvironmentStrings();
|
||||
count = GetDosArgv(cmd16, argblock, ARG_MAX, argarray, 512);
|
||||
for (i = 0; argarray[0][i]; ++i) {
|
||||
if (argarray[0][i] == '\\') argarray[0][i] = '/';
|
||||
count = GetDosArgv(cmd16, argblock, ARG_MAX, argv, 512);
|
||||
for (i = 0; argv[0][i]; ++i) {
|
||||
if (argv[0][i] == '\\') argv[0][i] = '/';
|
||||
}
|
||||
GetDosEnviron(env16, envblock, ENV_MAX, envarray, 512);
|
||||
GetDosEnviron(env16, envblock, ENV_MAX, envp, 512);
|
||||
FreeEnvironmentStrings(env16);
|
||||
_executive(count, argarray, envarray, auxarray);
|
||||
stack = MapViewOfFileExNuma(
|
||||
CreateFileMappingNuma(-1, NULL, pushpop(kNtPageReadwrite), 0, STACKSIZE,
|
||||
NULL, kNtNumaNoPreferredNode),
|
||||
kNtFileMapRead | kNtFileMapWrite, 0, 0, STACKSIZE,
|
||||
(char *)0x777000000000 - STACKSIZE, kNtNumaNoPreferredNode);
|
||||
return _setstack(stack + STACKSIZE, _executive, count, argv, envp, auxv);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue