mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
cd672e251f
This change fixes a bug where exiting a crash signal handler on Windows after adding the signal to uc_sigmask, but not correcting the CPU state would cause the signal handler to loop infinitely, causing process hang Another issue is that very tiny programs, that don't link posix signals would not have their SIGILL / SIGSEGV / etc. status reported to Cosmo's bash shell when terminating on crash. That's fixed by a tiny handler in WinMain() that knows how to map WIN32 crash codes to the POSIX flavors.
526 lines
11 KiB
Makefile
526 lines
11 KiB
Makefile
#-*-mode:makefile-gmake;indent-tabs-mode:t;tab-width:8;coding:utf-8-*-┐
|
|
#── vi: set et ft=make ts=8 sw=8 fenc=utf-8 :vi ──────────────────────┘
|
|
|
|
# Default Mode
|
|
#
|
|
# - `make`
|
|
# - Optimized
|
|
# - Backtraces
|
|
# - Syscall tracing
|
|
# - Function tracing
|
|
#
|
|
ifeq ($(MODE),)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CCFLAGS += -O2 $(BACKTRACES)
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG
|
|
TARGET_ARCH ?= -msse3
|
|
endif
|
|
ifeq ($(MODE), x86_64)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CCFLAGS += -O2 $(BACKTRACES)
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG
|
|
endif
|
|
ifeq ($(MODE), aarch64)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CCFLAGS += -O2 $(BACKTRACES)
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG
|
|
endif
|
|
|
|
# Zero Optimization Mode
|
|
#
|
|
# - Goes 2x slower
|
|
# - Supports --strace
|
|
# - Unsupports --ftrace
|
|
# - Better GDB debugging
|
|
#
|
|
ifeq ($(MODE), zero)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
OVERRIDE_CFLAGS += -O0
|
|
OVERRIDE_CXXFLAGS += -O0
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG
|
|
endif
|
|
ifeq ($(MODE), aarch64-zero)
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
OVERRIDE_CFLAGS += -O0 -fdce
|
|
OVERRIDE_CXXFLAGS += -O0 -fdce
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG
|
|
endif
|
|
|
|
# Fast Build Mode
|
|
#
|
|
# - `make MODE=fastbuild`
|
|
# - No debugging
|
|
# - Syscall tracing
|
|
# - Function tracing
|
|
# - Some optimizations
|
|
# - Limited Backtraces
|
|
#
|
|
ifeq ($(MODE), fastbuild)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -O
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG -DDWARFLESS
|
|
CONFIG_LDFLAGS += -S
|
|
TARGET_ARCH ?= -msse3
|
|
endif
|
|
|
|
# Optimized Mode
|
|
#
|
|
# - `make MODE=opt`
|
|
# - Backtraces
|
|
# - More optimized
|
|
# - Syscall tracing
|
|
# - Function tracing
|
|
# - Reasonably small
|
|
# - No memory corruption detection
|
|
# - assert() / CHECK_xx() may leak code into binary for debuggability
|
|
# - GCC 8+ hoists check fails into .text.cold, thus minimizing impact
|
|
#
|
|
ifeq ($(MODE), opt)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CPPFLAGS += -DNDEBUG -DSYSDEBUG
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -O3 -fmerge-all-constants
|
|
TARGET_ARCH ?= -march=native
|
|
endif
|
|
|
|
# Optimized Linux Mode
|
|
# The Fastest Mode of All
|
|
#
|
|
# - `make MODE=optlinux`
|
|
# - Turns on red zone
|
|
# - Turns off backtraces
|
|
# - Turns off function tracing
|
|
# - Turns off support for older cpu models
|
|
# - Turns off support for other operating systems
|
|
#
|
|
ifeq ($(MODE), optlinux)
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CPPFLAGS += -DNDEBUG -DSYSDEBUG -DSUPPORT_VECTOR=1
|
|
CONFIG_CCFLAGS += -O3 -fmerge-all-constants
|
|
CONFIG_COPTS += -mred-zone
|
|
TARGET_ARCH ?= -march=native
|
|
endif
|
|
|
|
# Release Mode
|
|
#
|
|
# Follows traditional closed source release binary norms.
|
|
#
|
|
# - `make MODE=rel`
|
|
# - More optimized
|
|
# - Reasonably small
|
|
# - Numeric backtraces
|
|
# - No DWARF data bloat
|
|
# - Toilsome debuggability
|
|
# - assert() statements removed
|
|
# - DCHECK_xx() statements removed
|
|
# - No memory corruption detection
|
|
# - CHECK_xx() won't leak strings into binary
|
|
#
|
|
ifeq ($(MODE), rel)
|
|
CONFIG_CPPFLAGS += -DNDEBUG -DDWARFLESS
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -O2
|
|
TARGET_ARCH ?= -msse3
|
|
PYFLAGS += -O1
|
|
endif
|
|
|
|
# Asan Mode
|
|
#
|
|
# Safer binaries good for backend production serving.
|
|
#
|
|
# - `make MODE=asan`
|
|
# - Memory safety
|
|
# - Production worthy
|
|
# - Backtraces
|
|
# - Debuggability
|
|
# - Larger binaries
|
|
#
|
|
ifeq ($(MODE), asan)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CPPFLAGS += -D__SANITIZE_ADDRESS__
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -O2 -DSYSDEBUG
|
|
CONFIG_COPTS += -fsanitize=address
|
|
TARGET_ARCH ?= -msse3
|
|
QUOTA ?= -C64 -L300
|
|
endif
|
|
|
|
# Debug Mode
|
|
#
|
|
# - `make MODE=dbg`
|
|
# - Backtraces
|
|
# - Enables asan
|
|
# - Enables ubsan
|
|
# - Stack canaries
|
|
# - No optimization
|
|
# - Enormous binaries
|
|
#
|
|
ifeq ($(MODE), dbg)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CPPFLAGS += -DMODE_DBG -D__SANITIZE_ADDRESS__ -D__SANITIZE_UNDEFINED__
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -DSYSDEBUG -O0 -fno-inline
|
|
CONFIG_COPTS += -fsanitize=address -fsanitize=undefined
|
|
TARGET_ARCH ?= -msse3
|
|
OVERRIDE_CCFLAGS += -fno-pie
|
|
QUOTA ?= -C64 -L300
|
|
endif
|
|
ifeq ($(MODE), aarch64-dbg)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CPPFLAGS += -DMODE_DBG -D__SANITIZE_UNDEFINED__
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -DSYSDEBUG -O0 -fno-inline -fdce
|
|
CONFIG_COPTS += -fsanitize=undefined
|
|
QUOTA ?= -C64 -L300
|
|
endif
|
|
|
|
# System Five Mode
|
|
#
|
|
# - `make MODE=sysv`
|
|
# - Optimized
|
|
# - Backtraces
|
|
# - Debuggable
|
|
# - Syscall tracing
|
|
# - Function tracing
|
|
# - No Windows bloat!
|
|
#
|
|
ifeq ($(MODE), sysv)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -O2
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG -DSUPPORT_VECTOR=121
|
|
TARGET_ARCH ?= -msse3
|
|
endif
|
|
|
|
# Tiny Mode
|
|
#
|
|
# - `make MODE=tiny`
|
|
# - No checks
|
|
# - No asserts
|
|
# - No canaries
|
|
# - No paranoia
|
|
# - No avx hooks
|
|
# - No backtraces
|
|
# - No algorithmics
|
|
# - YOLO
|
|
#
|
|
ifeq ($(MODE), tiny)
|
|
CONFIG_CPPFLAGS += \
|
|
-DTINY \
|
|
-DNDEBUG \
|
|
-DTRUSTWORTHY
|
|
CONFIG_CCFLAGS += \
|
|
-Os \
|
|
-fno-align-functions \
|
|
-fno-align-jumps \
|
|
-fno-align-labels \
|
|
-fno-align-loops \
|
|
-fschedule-insns2 \
|
|
-momit-leaf-frame-pointer \
|
|
-foptimize-sibling-calls \
|
|
-DDWARFLESS
|
|
TARGET_ARCH ?= \
|
|
-msse3
|
|
PYFLAGS += \
|
|
-O2 \
|
|
-B
|
|
endif
|
|
ifeq ($(MODE), x86_64-tiny)
|
|
CONFIG_CPPFLAGS += \
|
|
-DTINY \
|
|
-DNDEBUG \
|
|
-DTRUSTWORTHY
|
|
CONFIG_CCFLAGS += \
|
|
-Os \
|
|
-fno-align-functions \
|
|
-fno-align-jumps \
|
|
-fno-align-labels \
|
|
-fno-align-loops \
|
|
-fschedule-insns2 \
|
|
-momit-leaf-frame-pointer \
|
|
-foptimize-sibling-calls \
|
|
-DDWARFLESS
|
|
TARGET_ARCH ?= \
|
|
-msse3
|
|
PYFLAGS += \
|
|
-O2 \
|
|
-B
|
|
endif
|
|
ifeq ($(MODE), aarch64-tiny)
|
|
# TODO(jart): -mcmodel=tiny
|
|
CONFIG_CPPFLAGS += \
|
|
-DTINY \
|
|
-DNDEBUG \
|
|
-DTRUSTWORTHY
|
|
CONFIG_CCFLAGS += \
|
|
-Os \
|
|
-fno-align-functions \
|
|
-fno-align-jumps \
|
|
-fno-align-labels \
|
|
-fno-align-loops \
|
|
-fschedule-insns2 \
|
|
-momit-leaf-frame-pointer \
|
|
-foptimize-sibling-calls \
|
|
-DDWARFLESS
|
|
PYFLAGS += \
|
|
-O2 \
|
|
-B
|
|
endif
|
|
|
|
# Linux-Only Tiny Mode
|
|
#
|
|
# - `make MODE=tinylinux`
|
|
# - No checks
|
|
# - No asserts
|
|
# - No canaries
|
|
# - No paranoia
|
|
# - No avx hooks
|
|
# - No backtraces
|
|
# - No portability
|
|
# - No algorithmics
|
|
# - YOLO
|
|
#
|
|
ifeq ($(MODE), tinylinux)
|
|
CONFIG_CPPFLAGS += \
|
|
-DTINY \
|
|
-DNDEBUG \
|
|
-DTRUSTWORTHY \
|
|
-DSUPPORT_VECTOR=1 \
|
|
-DDWARFLESS
|
|
CONFIG_CCFLAGS += \
|
|
-Os \
|
|
-fno-align-functions \
|
|
-fno-align-jumps \
|
|
-fno-align-labels \
|
|
-fno-align-loops
|
|
TARGET_ARCH ?= \
|
|
-msse3
|
|
endif
|
|
|
|
# Linux+BSD Tiny Mode
|
|
#
|
|
# - `make MODE=tinylinuxbsd`
|
|
# - No apple
|
|
# - No checks
|
|
# - No asserts
|
|
# - No canaries
|
|
# - No paranoia
|
|
# - No microsoft
|
|
# - No avx hooks
|
|
# - No backtraces
|
|
# - No algorithmics
|
|
# - YOLO
|
|
#
|
|
ifeq ($(MODE), tinylinuxbsd)
|
|
CONFIG_CPPFLAGS += \
|
|
-DTINY \
|
|
-DNDEBUG \
|
|
-DTRUSTWORTHY \
|
|
-DSUPPORT_VECTOR=113 \
|
|
-DDWARFLESS
|
|
CONFIG_CCFLAGS += \
|
|
-Os \
|
|
-fno-align-functions \
|
|
-fno-align-jumps \
|
|
-fno-align-labels \
|
|
-fno-align-loops
|
|
TARGET_ARCH ?= \
|
|
-msse3
|
|
endif
|
|
|
|
# Unix Tiny Mode
|
|
#
|
|
# - `make MODE=tinysysv`
|
|
# - No checks
|
|
# - No asserts
|
|
# - No canaries
|
|
# - No paranoia
|
|
# - No microsoft
|
|
# - No avx hooks
|
|
# - No backtraces
|
|
# - No algorithmics
|
|
# - YOLO
|
|
#
|
|
ifeq ($(MODE), tinysysv)
|
|
CONFIG_CPPFLAGS += \
|
|
-DTINY \
|
|
-DNDEBUG \
|
|
-DTRUSTWORTHY \
|
|
-DSUPPORT_VECTOR=121 \
|
|
-DDWARFLESS
|
|
CONFIG_CCFLAGS += \
|
|
-Os \
|
|
-fno-align-functions \
|
|
-fno-align-jumps \
|
|
-fno-align-labels \
|
|
-fno-align-loops
|
|
TARGET_ARCH ?= \
|
|
-msse3
|
|
endif
|
|
|
|
# Tiny Metallic Unix Mode
|
|
#
|
|
# - `make MODE=tinynowin`
|
|
# - No checks
|
|
# - No asserts
|
|
# - No canaries
|
|
# - No paranoia
|
|
# - No microsoft
|
|
# - No avx hooks
|
|
# - No backtraces
|
|
# - No algorithmics
|
|
# - YOLO
|
|
#
|
|
ifeq ($(MODE), tinynowin)
|
|
CONFIG_CPPFLAGS += \
|
|
-DTINY \
|
|
-DNDEBUG \
|
|
-DTRUSTWORTHY \
|
|
-DSUPPORT_VECTOR=251 \
|
|
-DDWARFLESS
|
|
CONFIG_CCFLAGS += \
|
|
-Os \
|
|
-fno-align-functions \
|
|
-fno-align-jumps \
|
|
-fno-align-labels \
|
|
-fno-align-loops
|
|
TARGET_ARCH ?= \
|
|
-msse3
|
|
endif
|
|
|
|
# no x87 instructions mode
|
|
#
|
|
# export MODE=nox87
|
|
# make -j8 toolchain
|
|
# cosmocc -o /tmp/hello.com hello.c
|
|
#
|
|
# lets you shave ~23kb off blink
|
|
#
|
|
# git clone https://github.com/jart/blink
|
|
# cd blink
|
|
# ./configure --disable-x87
|
|
# make -j8
|
|
# o//blink/blink /tmp/hello.com
|
|
#
|
|
ifeq ($(MODE), nox87)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_COPTS += -mlong-double-64
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -O2
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG -DNOX87
|
|
TARGET_ARCH ?= -msse3
|
|
endif
|
|
|
|
# LLVM Mode
|
|
#
|
|
# We aim to support:
|
|
#
|
|
# make -j8 m=llvm o/llvm/libc
|
|
#
|
|
# The rest of the monorepo may not work with llvm.
|
|
#
|
|
ifeq ($(MODE), llvm)
|
|
.STRICT = 0
|
|
TARGET_ARCH ?= -msse3
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -DSYSDEBUG -O2
|
|
AS = clang
|
|
CC = clang
|
|
CXX = clang++
|
|
CXXFILT = llvm-c++filt
|
|
LD = ld.lld
|
|
NM = llvm-nm
|
|
GCC = clang
|
|
STRIP = llvm-strip
|
|
OBJCOPY = llvm-objcopy
|
|
OBJDUMP = llvm-objdump
|
|
ADDR2LINE = llvm-addr2line
|
|
endif
|
|
|
|
# ANSI Mode
|
|
#
|
|
# These flags cause GCC to predefine __STRICT_ANSI__. Please be warned
|
|
# that Cosmopolitan headers are written to comply with that request if
|
|
# it's possible to do so. Consider the following example:
|
|
#
|
|
# make -j12 -O o//tool/viz/printvideo.i
|
|
# clang-format-10 -i o//tool/viz/printvideo.i
|
|
# less o//tool/viz/printvideo.i
|
|
#
|
|
# You'll notice functions like memcpy(), ioctl(), etc. get expanded into
|
|
# wild-eyed gnu-style performance hacks. You can turn it off as follows:
|
|
#
|
|
# make -j12 -O MODE=ansi o/ansi/tool/viz/printvideo.i
|
|
# clang-format-10 -i o/ansi/tool/viz/printvideo.i
|
|
# less o/ansi/tool/viz/printvideo.i
|
|
#
|
|
# Here it becomes clear that ANSI mode can help you decouple your source
|
|
# from Cosmopolitan, by turning it into plain ordinary textbook C code.
|
|
#
|
|
# Another potential use case is distributing code to folks using tools
|
|
# such as MSVC or XCode. You can run your binary objects through a tool
|
|
# like objconv to convert them to COFF or MachO. Then use ANSI mode to
|
|
# rollup one header file that'll enable linkage with minimal issues.
|
|
ifeq ($(MODE), ansi)
|
|
CONFIG_CFLAGS += -std=c11
|
|
#CONFIG_CPPFLAGS += -ansi
|
|
CONFIG_CXXFLAGS += -std=c++11
|
|
TARGET_ARCH ?= -msse3
|
|
endif
|
|
|
|
ifneq ($(ENABLE_FTRACE),)
|
|
CONFIG_CPPFLAGS += -DFTRACE
|
|
FTRACE_CCFLAGS = -fno-inline-functions-called-once
|
|
OVERRIDE_CFLAGS += $(FTRACE_CCFLAGS)
|
|
OVERRIDE_CXXFLAGS += $(FTRACE_CCFLAGS)
|
|
# function prologue nops for --ftrace
|
|
ifeq ($(ARCH), x86_64)
|
|
# this flag causes gcc to generate functions like this
|
|
#
|
|
# nop nop nop nop nop nop nop nop nop
|
|
# func:
|
|
# nop nop
|
|
# ...
|
|
#
|
|
# which tool/build/fixupobj.c improves at build time like this
|
|
#
|
|
# nop nop nop nop nop nop nop nop nop
|
|
# func:
|
|
# xchg %ax,%ax
|
|
# ...
|
|
#
|
|
# which --ftrace morphs at runtime like this
|
|
#
|
|
# ud2 # 2 bytes
|
|
# call ftrace_hook # 5 bytes
|
|
# jmp +2 # 2 bytes
|
|
# func:
|
|
# jmp -7 # 2 bytes
|
|
# ...
|
|
#
|
|
CONFIG_CCFLAGS += -fpatchable-function-entry=18,16
|
|
endif
|
|
ifeq ($(ARCH), aarch64)
|
|
# this flag causes gcc to generate functions like this
|
|
#
|
|
# nop nop nop nop nop nop
|
|
# func:
|
|
# nop
|
|
# ...
|
|
#
|
|
# which --ftrace morphs at runtime like this
|
|
#
|
|
# brk #31337
|
|
# stp x29,x30,[sp,#-16]!
|
|
# mov x29,sp
|
|
# bl ftrace_hook
|
|
# ldp x29,x30,[sp],#16
|
|
# b +1
|
|
# func:
|
|
# b -5
|
|
# ...
|
|
#
|
|
CONFIG_CCFLAGS += -fpatchable-function-entry=7,6
|
|
endif
|
|
endif
|