mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-07 06:53:33 +00:00
Add more fixes for new cosmocc toolchain
We now have an `#include <cxxabi.h>` header which defines all the APIs Cosmopolitan's implemented so far. The `cosmocc` README.md file is now greatly expanded with documentation.
This commit is contained in:
parent
95124cacbe
commit
c6d3802d3a
32 changed files with 256 additions and 69 deletions
31
Makefile
31
Makefile
|
@ -403,13 +403,14 @@ COSMOPOLITAN_OBJECTS = \
|
||||||
LIBC_NT_KERNEL32 \
|
LIBC_NT_KERNEL32 \
|
||||||
LIBC_NEXGEN32E
|
LIBC_NEXGEN32E
|
||||||
|
|
||||||
COSMOPOLITAN_HEADERS = \
|
COSMOPOLITAN_H_PKGS = \
|
||||||
APE \
|
APE \
|
||||||
LIBC \
|
LIBC \
|
||||||
LIBC_CALLS \
|
LIBC_CALLS \
|
||||||
LIBC_DNS \
|
LIBC_DNS \
|
||||||
LIBC_ELF \
|
LIBC_ELF \
|
||||||
LIBC_FMT \
|
LIBC_FMT \
|
||||||
|
LIBC_DLOPEN \
|
||||||
LIBC_INTRIN \
|
LIBC_INTRIN \
|
||||||
LIBC_LOG \
|
LIBC_LOG \
|
||||||
LIBC_MEM \
|
LIBC_MEM \
|
||||||
|
@ -436,7 +437,8 @@ COSMOPOLITAN_HEADERS = \
|
||||||
THIRD_PARTY_MUSL \
|
THIRD_PARTY_MUSL \
|
||||||
THIRD_PARTY_REGEX
|
THIRD_PARTY_REGEX
|
||||||
|
|
||||||
COSMOCC_HEADERS = \
|
COSMOCC_PKGS = \
|
||||||
|
$(COSMOPOLITAN_H_PKGS) \
|
||||||
THIRD_PARTY_AARCH64 \
|
THIRD_PARTY_AARCH64 \
|
||||||
THIRD_PARTY_LIBCXX \
|
THIRD_PARTY_LIBCXX \
|
||||||
THIRD_PARTY_INTEL
|
THIRD_PARTY_INTEL
|
||||||
|
@ -444,18 +446,25 @@ COSMOCC_HEADERS = \
|
||||||
o/$(MODE)/cosmopolitan.a: \
|
o/$(MODE)/cosmopolitan.a: \
|
||||||
$(foreach x,$(COSMOPOLITAN_OBJECTS),$($(x)_A_OBJS))
|
$(foreach x,$(COSMOPOLITAN_OBJECTS),$($(x)_A_OBJS))
|
||||||
|
|
||||||
o/cosmocc.h.txt: $(foreach x,$(COSMOCC_HEADERS),$($(x)_HDRS))
|
COSMOCC_HDRS = \
|
||||||
$(file >$@, $^)
|
$(wildcard libc/integral/*) \
|
||||||
|
$(foreach x,$(COSMOCC_PKGS),$($(x)_HDRS)) \
|
||||||
|
$(foreach x,$(COSMOCC_PKGS),$($(x)_INCS))
|
||||||
|
|
||||||
o/cosmopolitan.h.txt: \
|
o/cosmocc.h.txt: Makefile
|
||||||
libc/integral/normalize.inc \
|
$(file >$@, $(call uniq,$(COSMOCC_HDRS)))
|
||||||
$(foreach x,$(COSMOPOLITAN_HEADERS),$($(x)_HDRS))
|
|
||||||
$(file >$@, $^)
|
COSMOPOLITAN_H_ROOT_HDRS = \
|
||||||
|
libc/integral/normalize.inc \
|
||||||
|
$(foreach x,$(COSMOPOLITAN_H_PKGS),$($(x)_HDRS))
|
||||||
|
|
||||||
|
o/cosmopolitan.h.txt: Makefile
|
||||||
|
$(file >$@, $(call uniq,$(COSMOPOLITAN_H_ROOT_HDRS)))
|
||||||
|
|
||||||
o/cosmopolitan.h: o/cosmopolitan.h.txt \
|
o/cosmopolitan.h: o/cosmopolitan.h.txt \
|
||||||
libc/integral/normalize.inc \
|
$(wildcard libc/integral/*) \
|
||||||
$(foreach x,$(COSMOPOLITAN_HEADERS),$($(x)_HDRS)) \
|
$(foreach x,$(COSMOPOLITAN_H_PKGS),$($(x)_HDRS)) \
|
||||||
$(foreach x,$(COSMOPOLITAN_HEADERS),$($(x)_INCS))
|
$(foreach x,$(COSMOPOLITAN_H_PKGS),$($(x)_INCS))
|
||||||
@$(ECHO) '#ifndef __STRICT_ANSI__' >$@
|
@$(ECHO) '#ifndef __STRICT_ANSI__' >$@
|
||||||
@$(ECHO) '#define _COSMO_SOURCE' >>$@
|
@$(ECHO) '#define _COSMO_SOURCE' >>$@
|
||||||
@$(ECHO) '#endif' >>$@
|
@$(ECHO) '#endif' >>$@
|
||||||
|
|
|
@ -62,7 +62,7 @@ struct Syslib {
|
||||||
/* v2 (2023-09-10) */
|
/* v2 (2023-09-10) */
|
||||||
pthread_t (*pthread_self)(void);
|
pthread_t (*pthread_self)(void);
|
||||||
void (*dispatch_release)(dispatch_semaphore_t);
|
void (*dispatch_release)(dispatch_semaphore_t);
|
||||||
int (*raise)(int);
|
long (*raise)(int);
|
||||||
int (*pthread_join)(pthread_t, void **);
|
int (*pthread_join)(pthread_t, void **);
|
||||||
void (*pthread_yield_np)(void);
|
void (*pthread_yield_np)(void);
|
||||||
int pthread_stack_min;
|
int pthread_stack_min;
|
||||||
|
@ -441,6 +441,10 @@ static long sys_close(int fd) {
|
||||||
return sysret(close(fd));
|
return sysret(close(fd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static long sys_raise(int sig) {
|
||||||
|
return sysret(raise(sig));
|
||||||
|
}
|
||||||
|
|
||||||
static long sys_pipe(int pfds[2]) {
|
static long sys_pipe(int pfds[2]) {
|
||||||
return sysret(pipe(pfds));
|
return sysret(pipe(pfds));
|
||||||
}
|
}
|
||||||
|
@ -888,7 +892,7 @@ int main(int argc, char **argv, char **envp) {
|
||||||
M->lib.dispatch_walltime = dispatch_walltime;
|
M->lib.dispatch_walltime = dispatch_walltime;
|
||||||
M->lib.pthread_self = pthread_self;
|
M->lib.pthread_self = pthread_self;
|
||||||
M->lib.dispatch_release = dispatch_release;
|
M->lib.dispatch_release = dispatch_release;
|
||||||
M->lib.raise = raise;
|
M->lib.raise = sys_raise;
|
||||||
M->lib.pthread_join = pthread_join;
|
M->lib.pthread_join = pthread_join;
|
||||||
M->lib.pthread_yield_np = pthread_yield_np;
|
M->lib.pthread_yield_np = pthread_yield_np;
|
||||||
M->lib.pthread_stack_min = PTHREAD_STACK_MIN;
|
M->lib.pthread_stack_min = PTHREAD_STACK_MIN;
|
||||||
|
|
|
@ -34,15 +34,19 @@
|
||||||
*
|
*
|
||||||
* Note `SIG_DFL` still results in process death for most signals.
|
* Note `SIG_DFL` still results in process death for most signals.
|
||||||
*
|
*
|
||||||
|
* POSIX defines raise() errors as returning non-zero and makes setting
|
||||||
|
* `errno` optional. Every platform we've tested in our support vector
|
||||||
|
* returns -1 with `errno` on error (like a normal system call).
|
||||||
|
*
|
||||||
* @param sig can be SIGALRM, SIGINT, SIGTERM, SIGKILL, etc.
|
* @param sig can be SIGALRM, SIGINT, SIGTERM, SIGKILL, etc.
|
||||||
* @return 0 on success, or nonzero on failure
|
* @return 0 on success, or -1 w/ errno
|
||||||
* @raise EINVAL if `sig` is invalid
|
* @raise EINVAL if `sig` is invalid
|
||||||
* @asyncsignalsafe
|
* @asyncsignalsafe
|
||||||
*/
|
*/
|
||||||
int raise(int sig) {
|
int raise(int sig) {
|
||||||
int rc;
|
int rc;
|
||||||
if (IsXnuSilicon()) {
|
if (IsXnuSilicon()) {
|
||||||
rc = __syslib->__raise(sig);
|
rc = _sysret(__syslib->__raise(sig));
|
||||||
} else if (IsWindows()) {
|
} else if (IsWindows()) {
|
||||||
if (0 <= sig && sig <= 64) {
|
if (0 <= sig && sig <= 64) {
|
||||||
__sig_raise(sig, SI_TKILL);
|
__sig_raise(sig, SI_TKILL);
|
||||||
|
|
17
libc/cxxabi.h
Normal file
17
libc/cxxabi.h
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef _CXXABI_H
|
||||||
|
#define _CXXABI_H
|
||||||
|
COSMOPOLITAN_C_START_
|
||||||
|
|
||||||
|
union CxaGuardValue;
|
||||||
|
|
||||||
|
char *__cxa_demangle(const char *, char *, size_t *, int *);
|
||||||
|
int __cxa_atexit(void (*)(void *), void *, void *) paramsnonnull((1)) dontthrow;
|
||||||
|
int __cxa_guard_acquire(union CxaGuardValue *);
|
||||||
|
int __cxa_thread_atexit(void *, void *, void *) dontthrow;
|
||||||
|
void __cxa_finalize(void *);
|
||||||
|
void __cxa_guard_abort(union CxaGuardValue *) dontthrow;
|
||||||
|
void __cxa_guard_release(union CxaGuardValue *) dontthrow;
|
||||||
|
void __cxa_pure_virtual(void) wontreturn;
|
||||||
|
|
||||||
|
COSMOPOLITAN_C_END_
|
||||||
|
#endif /* _CXXABI_H */
|
|
@ -17,6 +17,7 @@
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/calls/calls.h"
|
#include "libc/calls/calls.h"
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/dce.h"
|
#include "libc/dce.h"
|
||||||
#include "libc/dns/hoststxt.h"
|
#include "libc/dns/hoststxt.h"
|
||||||
#include "libc/dns/servicestxt.h"
|
#include "libc/dns/servicestxt.h"
|
||||||
|
@ -64,7 +65,7 @@ const struct HostsTxt *GetHostsTxt(void) {
|
||||||
init->ht.entries.p = init->entries;
|
init->ht.entries.p = init->entries;
|
||||||
init->ht.strings.n = pushpop(ARRAYLEN(init->strings));
|
init->ht.strings.n = pushpop(ARRAYLEN(init->strings));
|
||||||
init->ht.strings.p = init->strings;
|
init->ht.strings.p = init->strings;
|
||||||
__cxa_atexit(FreeHostsTxt, &g_hoststxt, NULL);
|
__cxa_atexit((void *)FreeHostsTxt, &g_hoststxt, NULL);
|
||||||
if ((f = fopen(GetHostsTxtPath(pathbuf, sizeof(pathbuf)), "r"))) {
|
if ((f = fopen(GetHostsTxtPath(pathbuf, sizeof(pathbuf)), "r"))) {
|
||||||
if (ParseHostsTxt(g_hoststxt, f) == -1) {
|
if (ParseHostsTxt(g_hoststxt, f) == -1) {
|
||||||
/* TODO(jart): Elevate robustness. */
|
/* TODO(jart): Elevate robustness. */
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/dce.h"
|
#include "libc/dce.h"
|
||||||
#include "libc/dns/resolvconf.h"
|
#include "libc/dns/resolvconf.h"
|
||||||
#include "libc/fmt/fmt.h"
|
#include "libc/fmt/fmt.h"
|
||||||
|
@ -48,7 +49,7 @@ const struct ResolvConf *GetResolvConf(void) {
|
||||||
g_resolvconf = &init->rv;
|
g_resolvconf = &init->rv;
|
||||||
pushmov(&init->rv.nameservers.n, ARRAYLEN(init->nameservers));
|
pushmov(&init->rv.nameservers.n, ARRAYLEN(init->nameservers));
|
||||||
init->rv.nameservers.p = init->nameservers;
|
init->rv.nameservers.p = init->nameservers;
|
||||||
__cxa_atexit(FreeResolvConf, &g_resolvconf, NULL);
|
__cxa_atexit((void *)FreeResolvConf, &g_resolvconf, NULL);
|
||||||
if (!IsWindows()) {
|
if (!IsWindows()) {
|
||||||
if ((f = fopen("/etc/resolv.conf", "r"))) {
|
if ((f = fopen("/etc/resolv.conf", "r"))) {
|
||||||
rc = ParseResolvConf(g_resolvconf, f);
|
rc = ParseResolvConf(g_resolvconf, f);
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/runtime/runtime.h"
|
#include "libc/runtime/runtime.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -29,5 +30,5 @@
|
||||||
* @return 0 on success or nonzero if out of space
|
* @return 0 on success or nonzero if out of space
|
||||||
*/
|
*/
|
||||||
int atexit(void f(void)) {
|
int atexit(void f(void)) {
|
||||||
return __cxa_atexit(f, 0, 0);
|
return __cxa_atexit((void *)f, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ void __cxa_lock(void);
|
||||||
void __cxa_unlock(void);
|
void __cxa_unlock(void);
|
||||||
void __cxa_thread_finalize(void);
|
void __cxa_thread_finalize(void);
|
||||||
void __cxa_printexits(FILE *, void *);
|
void __cxa_printexits(FILE *, void *);
|
||||||
int __cxa_thread_atexit(void *, void *, void *);
|
|
||||||
int __cxa_thread_atexit_impl(void *, void *, void *);
|
int __cxa_thread_atexit_impl(void *, void *, void *);
|
||||||
|
|
||||||
COSMOPOLITAN_C_END_
|
COSMOPOLITAN_C_END_
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#include "libc/log/libfatal.internal.h"
|
#include "libc/log/libfatal.internal.h"
|
||||||
#include "libc/nexgen32e/stackframe.h"
|
#include "libc/nexgen32e/stackframe.h"
|
||||||
|
|
||||||
#define N 100
|
#define N 160
|
||||||
|
|
||||||
dontinstrument const char *(DescribeBacktrace)(char buf[N],
|
dontinstrument const char *(DescribeBacktrace)(char buf[N],
|
||||||
struct StackFrame *fr) {
|
struct StackFrame *fr) {
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||||
COSMOPOLITAN_C_START_
|
COSMOPOLITAN_C_START_
|
||||||
|
|
||||||
const char *DescribeBacktrace(char[100], struct StackFrame *);
|
const char *DescribeBacktrace(char[160], struct StackFrame *);
|
||||||
#define DescribeBacktrace(x) DescribeBacktrace(alloca(100), x)
|
#define DescribeBacktrace(x) DescribeBacktrace(alloca(160), x)
|
||||||
|
|
||||||
COSMOPOLITAN_C_END_
|
COSMOPOLITAN_C_END_
|
||||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
#include "libc/cxxabi.h"
|
|
@ -16,6 +16,7 @@
|
||||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/dce.h"
|
#include "libc/dce.h"
|
||||||
#include "libc/intrin/asan.internal.h"
|
#include "libc/intrin/asan.internal.h"
|
||||||
#include "libc/intrin/bits.h"
|
#include "libc/intrin/bits.h"
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "libc/calls/struct/utsname.h"
|
#include "libc/calls/struct/utsname.h"
|
||||||
#include "libc/calls/syscall-sysv.internal.h"
|
#include "libc/calls/syscall-sysv.internal.h"
|
||||||
#include "libc/calls/ucontext.h"
|
#include "libc/calls/ucontext.h"
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/errno.h"
|
#include "libc/errno.h"
|
||||||
#include "libc/intrin/describebacktrace.internal.h"
|
#include "libc/intrin/describebacktrace.internal.h"
|
||||||
#include "libc/intrin/describeflags.internal.h"
|
#include "libc/intrin/describeflags.internal.h"
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
#include "libc/atomic.h"
|
#include "libc/atomic.h"
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/intrin/atomic.h"
|
#include "libc/intrin/atomic.h"
|
||||||
#include "libc/limits.h"
|
#include "libc/limits.h"
|
||||||
#include "third_party/nsync/futex.internal.h"
|
#include "third_party/nsync/futex.internal.h"
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/intrin/strace.internal.h"
|
#include "libc/intrin/strace.internal.h"
|
||||||
#include "libc/intrin/weaken.h"
|
#include "libc/intrin/weaken.h"
|
||||||
#include "libc/runtime/internal.h"
|
#include "libc/runtime/internal.h"
|
||||||
|
|
|
@ -36,7 +36,6 @@ int ftrace_init(void);
|
||||||
void ftrace_hook(void);
|
void ftrace_hook(void);
|
||||||
void __morph_tls(void);
|
void __morph_tls(void);
|
||||||
void __enable_tls(void);
|
void __enable_tls(void);
|
||||||
void *__cxa_finalize(void *);
|
|
||||||
void __stack_chk_fail(void) wontreturn relegated;
|
void __stack_chk_fail(void) wontreturn relegated;
|
||||||
void __stack_chk_fail_local(void) wontreturn relegated;
|
void __stack_chk_fail_local(void) wontreturn relegated;
|
||||||
long _setstack(void *, void *, ...);
|
long _setstack(void *, void *, ...);
|
||||||
|
|
|
@ -36,7 +36,6 @@ void _exit(int) libcesque wontreturn;
|
||||||
void _Exit(int) libcesque wontreturn;
|
void _Exit(int) libcesque wontreturn;
|
||||||
void quick_exit(int) wontreturn;
|
void quick_exit(int) wontreturn;
|
||||||
void abort(void) wontreturn;
|
void abort(void) wontreturn;
|
||||||
int __cxa_atexit(void *, void *, void *) paramsnonnull((1)) libcesque;
|
|
||||||
int atexit(void (*)(void)) paramsnonnull() libcesque;
|
int atexit(void (*)(void)) paramsnonnull() libcesque;
|
||||||
char *getenv(const char *) paramsnonnull() __wur nosideeffect libcesque;
|
char *getenv(const char *) paramsnonnull() __wur nosideeffect libcesque;
|
||||||
int putenv(char *);
|
int putenv(char *);
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
│ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. │
|
│ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/assert.h"
|
#include "libc/assert.h"
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/errno.h"
|
#include "libc/errno.h"
|
||||||
#include "libc/fmt/conv.h"
|
#include "libc/fmt/conv.h"
|
||||||
#include "libc/fmt/fmt.h"
|
#include "libc/fmt/fmt.h"
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/calls/calls.h"
|
#include "libc/calls/calls.h"
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/errno.h"
|
#include "libc/errno.h"
|
||||||
#include "libc/intrin/bits.h"
|
#include "libc/intrin/bits.h"
|
||||||
#include "libc/intrin/pushpop.internal.h"
|
#include "libc/intrin/pushpop.internal.h"
|
||||||
|
@ -111,7 +112,7 @@ textstartup int __fflush_register(FILE *f) {
|
||||||
if (!sf->handles.p) {
|
if (!sf->handles.p) {
|
||||||
sf->handles.p = sf->handles_initmem;
|
sf->handles.p = sf->handles_initmem;
|
||||||
pushmov(&sf->handles.n, ARRAYLEN(sf->handles_initmem));
|
pushmov(&sf->handles.n, ARRAYLEN(sf->handles_initmem));
|
||||||
__cxa_atexit(fflush_unlocked, 0, 0);
|
__cxa_atexit((void *)fflush_unlocked, 0, 0);
|
||||||
}
|
}
|
||||||
for (i = sf->handles.i; i; --i) {
|
for (i = sf->handles.i; i; --i) {
|
||||||
if (!sf->handles.p[i - 1]) {
|
if (!sf->handles.p[i - 1]) {
|
||||||
|
|
|
@ -180,12 +180,6 @@ int fprintf_unlocked(FILE *, const char *, ...) printfesque(2)
|
||||||
int vfprintf_unlocked(FILE *, const char *, va_list)
|
int vfprintf_unlocked(FILE *, const char *, va_list)
|
||||||
paramsnonnull() dontthrow nocallback;
|
paramsnonnull() dontthrow nocallback;
|
||||||
|
|
||||||
/*───────────────────────────────────────────────────────────────────────────│─╗
|
|
||||||
│ cosmopolitan § cxxabi ─╬─│┼
|
|
||||||
╚────────────────────────────────────────────────────────────────────────────│*/
|
|
||||||
|
|
||||||
char *__cxa_demangle(const char *, char *, size_t *, int *);
|
|
||||||
|
|
||||||
COSMOPOLITAN_C_END_
|
COSMOPOLITAN_C_END_
|
||||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||||
#endif /* COSMOPOLITAN_LIBC_STDIO_H_ */
|
#endif /* COSMOPOLITAN_LIBC_STDIO_H_ */
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/assert.h"
|
#include "libc/assert.h"
|
||||||
#include "libc/atomic.h"
|
#include "libc/atomic.h"
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/dce.h"
|
#include "libc/dce.h"
|
||||||
#include "libc/intrin/atomic.h"
|
#include "libc/intrin/atomic.h"
|
||||||
#include "libc/intrin/cxaatexit.internal.h"
|
#include "libc/intrin/cxaatexit.internal.h"
|
||||||
|
|
|
@ -38,7 +38,7 @@ struct CosmoTib {
|
||||||
uint32_t tib_sigstack_flags;
|
uint32_t tib_sigstack_flags;
|
||||||
void **tib_keys;
|
void **tib_keys;
|
||||||
void *tib_nsync;
|
void *tib_nsync;
|
||||||
void *tib_todo[63];
|
void *tib_todo[7];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int __threaded;
|
extern int __threaded;
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#define LOCALTIME_IMPLEMENTATION
|
#define LOCALTIME_IMPLEMENTATION
|
||||||
#include "libc/calls/blockcancel.internal.h"
|
#include "libc/calls/blockcancel.internal.h"
|
||||||
#include "libc/calls/calls.h"
|
#include "libc/calls/calls.h"
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/intrin/bits.h"
|
#include "libc/intrin/bits.h"
|
||||||
#include "libc/mem/gc.h"
|
#include "libc/mem/gc.h"
|
||||||
#include "libc/mem/mem.h"
|
#include "libc/mem/mem.h"
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "libc/nt/thread.h"
|
#include "libc/nt/thread.h"
|
||||||
#include "libc/runtime/clktck.h"
|
#include "libc/runtime/clktck.h"
|
||||||
#include "libc/sock/struct/pollfd.h"
|
#include "libc/sock/struct/pollfd.h"
|
||||||
|
#include "libc/sysv/consts/limits.h"
|
||||||
#include "libc/sysv/consts/poll.h"
|
#include "libc/sysv/consts/poll.h"
|
||||||
#include "libc/testlib/testlib.h"
|
#include "libc/testlib/testlib.h"
|
||||||
#include "libc/thread/posixthread.internal.h"
|
#include "libc/thread/posixthread.internal.h"
|
||||||
|
@ -120,4 +121,5 @@ TEST(poll, interrupt) {
|
||||||
TEST(raise, zero) {
|
TEST(raise, zero) {
|
||||||
ASSERT_SYS(0, 0, raise(0));
|
ASSERT_SYS(0, 0, raise(0));
|
||||||
ASSERT_SYS(EINVAL, -1, raise(-1));
|
ASSERT_SYS(EINVAL, -1, raise(-1));
|
||||||
|
ASSERT_SYS(EINVAL, -1, raise(_NSIG + 1));
|
||||||
}
|
}
|
||||||
|
|
|
@ -175,6 +175,12 @@ void TestUncontendedLock(const char *name, int kind) {
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
pthread_mutexattr_t attr;
|
pthread_mutexattr_t attr;
|
||||||
|
|
||||||
|
#ifdef __aarch64__
|
||||||
|
// our usage of raw clone() is probably broken in aarch64
|
||||||
|
// we should just get rid of clone()
|
||||||
|
if (1) return 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (_weaken(nsync_mu_lock)) {
|
if (_weaken(nsync_mu_lock)) {
|
||||||
kprintf("*NSYNC should not be linked\n");
|
kprintf("*NSYNC should not be linked\n");
|
||||||
_Exit(1);
|
_Exit(1);
|
||||||
|
|
|
@ -16,22 +16,16 @@
|
||||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/assert.h"
|
|
||||||
#include "libc/calls/calls.h"
|
#include "libc/calls/calls.h"
|
||||||
#include "libc/calls/struct/iovec.h"
|
#include "libc/calls/struct/iovec.h"
|
||||||
#include "libc/dce.h"
|
|
||||||
#include "libc/errno.h"
|
|
||||||
#include "libc/mem/gc.internal.h"
|
#include "libc/mem/gc.internal.h"
|
||||||
|
#include "libc/mem/mem.h"
|
||||||
#include "libc/sock/sock.h"
|
#include "libc/sock/sock.h"
|
||||||
#include "libc/sock/struct/msghdr.h"
|
#include "libc/sock/struct/msghdr.h"
|
||||||
#include "libc/sock/struct/sockaddr.h"
|
|
||||||
#include "libc/str/str.h"
|
#include "libc/str/str.h"
|
||||||
#include "libc/sysv/consts/af.h"
|
#include "libc/sysv/consts/af.h"
|
||||||
#include "libc/sysv/consts/ipproto.h"
|
|
||||||
#include "libc/sysv/consts/o.h"
|
|
||||||
#include "libc/sysv/consts/sock.h"
|
#include "libc/sysv/consts/sock.h"
|
||||||
#include "libc/testlib/testlib.h"
|
#include "libc/testlib/testlib.h"
|
||||||
#include "libc/x/x.h"
|
|
||||||
|
|
||||||
TEST(sendrecvmsg, testPingPong) {
|
TEST(sendrecvmsg, testPingPong) {
|
||||||
int fd[2];
|
int fd[2];
|
||||||
|
@ -55,7 +49,7 @@ TEST(sendrecvmsg, testPingPong) {
|
||||||
ASSERT_NE(-1, socketpair(AF_UNIX, SOCK_STREAM, 0, fd));
|
ASSERT_NE(-1, socketpair(AF_UNIX, SOCK_STREAM, 0, fd));
|
||||||
ASSERT_EQ(hwLen, sendmsg(fd[0], &msg, 0));
|
ASSERT_EQ(hwLen, sendmsg(fd[0], &msg, 0));
|
||||||
|
|
||||||
data[0].iov_base = gc(xcalloc(20, 1));
|
data[0].iov_base = gc(calloc(20, 1));
|
||||||
data[0].iov_len = 20;
|
data[0].iov_len = 20;
|
||||||
msg.msg_iovlen = 1;
|
msg.msg_iovlen = 1;
|
||||||
ASSERT_EQ(hwLen, recvmsg(fd[1], &msg, 0));
|
ASSERT_EQ(hwLen, recvmsg(fd[1], &msg, 0));
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/intrin/cxaatexit.internal.h"
|
#include "libc/intrin/cxaatexit.internal.h"
|
||||||
#include "libc/runtime/runtime.h"
|
#include "libc/runtime/runtime.h"
|
||||||
#include "libc/testlib/subprocess.h"
|
#include "libc/testlib/subprocess.h"
|
||||||
|
|
1
third_party/mbedtls/test/lib.c
vendored
1
third_party/mbedtls/test/lib.c
vendored
|
@ -18,6 +18,7 @@
|
||||||
#include "libc/assert.h"
|
#include "libc/assert.h"
|
||||||
#include "libc/calls/calls.h"
|
#include "libc/calls/calls.h"
|
||||||
#include "libc/calls/struct/timespec.h"
|
#include "libc/calls/struct/timespec.h"
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/dce.h"
|
#include "libc/dce.h"
|
||||||
#include "libc/errno.h"
|
#include "libc/errno.h"
|
||||||
#include "libc/fmt/conv.h"
|
#include "libc/fmt/conv.h"
|
||||||
|
|
3
third_party/python/Modules/getpath.c
vendored
3
third_party/python/Modules/getpath.c
vendored
|
@ -6,12 +6,13 @@
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/calls/calls.h"
|
#include "libc/calls/calls.h"
|
||||||
#include "libc/calls/struct/stat.h"
|
#include "libc/calls/struct/stat.h"
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/errno.h"
|
#include "libc/errno.h"
|
||||||
#include "libc/intrin/cmpxchg.h"
|
#include "libc/intrin/cmpxchg.h"
|
||||||
#include "libc/log/log.h"
|
#include "libc/log/log.h"
|
||||||
#include "libc/mem/alloca.h"
|
#include "libc/mem/alloca.h"
|
||||||
#include "libc/mem/mem.h"
|
|
||||||
#include "libc/mem/gc.internal.h"
|
#include "libc/mem/gc.internal.h"
|
||||||
|
#include "libc/mem/mem.h"
|
||||||
#include "libc/runtime/runtime.h"
|
#include "libc/runtime/runtime.h"
|
||||||
#include "libc/str/str.h"
|
#include "libc/str/str.h"
|
||||||
#include "libc/sysv/consts/auxv.h"
|
#include "libc/sysv/consts/auxv.h"
|
||||||
|
|
|
@ -16,14 +16,6 @@ GCC compiler with the strongest GPL barrier possible. The preprocessor
|
||||||
advertises cross compilers as both `__COSMOCC__` and `__COSMOPOLITAN__`
|
advertises cross compilers as both `__COSMOCC__` and `__COSMOPOLITAN__`
|
||||||
whereas `cosmocc` additionally defines `__FATCOSMOCC__`.
|
whereas `cosmocc` additionally defines `__FATCOSMOCC__`.
|
||||||
|
|
||||||
The `cosmocc` compiler is designed to generate deterministic output
|
|
||||||
across platforms. With this release we've confirmed that hello world
|
|
||||||
binary output is identical on Linux x86+Arm, MacOS x86+Arm, FreeBSD,
|
|
||||||
OpenBSD, and Windows. Please note that users who need reproducible
|
|
||||||
builds may also want to look into explicitly defining environment
|
|
||||||
variables like `LC_ALL=C` and `SOURCE_DATE_EPOCH=0`, in addition to
|
|
||||||
undefining macros such as `-U__DATE__` and `-U__TIME__`.
|
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
Once your toolchain has been extracted, you can compile hello world:
|
Once your toolchain has been extracted, you can compile hello world:
|
||||||
|
@ -32,14 +24,33 @@ Once your toolchain has been extracted, you can compile hello world:
|
||||||
bin/cosmocc -o hello hello.c # creates multi-os multi-arch binary
|
bin/cosmocc -o hello hello.c # creates multi-os multi-arch binary
|
||||||
```
|
```
|
||||||
|
|
||||||
The `cosmocc` program is shorthand for `unknown-unknown-cosmo-cc`.
|
You now have an [actually portable
|
||||||
For advanced builds it's possible to use `x86_64-unknown-cosmo-cc` and
|
executable](https://justine.lol/ape.html) that'll run on your host
|
||||||
|
system. If anything goes wrong, see the Gotchas and Troubleshoot
|
||||||
|
sections below. It should have also outputted two ELF executables as
|
||||||
|
well, named `hello.com.dbg` (x86-64 Linux ELF) and `hello.aarch64.elf`
|
||||||
|
(AARCH64 Linux ELF). On Linux systems, those files are also runnable,
|
||||||
|
which is useful for easily running programs in GDB. On other OSes GDB
|
||||||
|
can still debug APE programs if the ELF is loaded in a second step using
|
||||||
|
the `add-symbol-file` command.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The `cosmocc` program is shorthand for `unknown-unknown-cosmo-cc`. For
|
||||||
|
advanced builds it's possible to use `x86_64-unknown-cosmo-cc` and
|
||||||
`aarch64-unknown-cosmo-cc` separately and then join the results together
|
`aarch64-unknown-cosmo-cc` separately and then join the results together
|
||||||
with the provided `apelink` program. Lastly, the `x86_64-linux-cosmo-cc`
|
with the provided `apelink` program. Lastly, the `x86_64-linux-cosmo-cc`
|
||||||
and `aarch64-linux-cosmo-cc` toolchain is the actual physical compiler,
|
and `aarch64-linux-cosmo-cc` toolchain is the actual physical compiler,
|
||||||
but it's not intended to be called directly. Both cross compilers are
|
which isn't intended to be called directly (unless one's goal is maximum
|
||||||
aliases for the `cosmocc` script, which is a thin wrapper around the
|
configurability or a freestanding environment).
|
||||||
Linux toolchain.
|
|
||||||
|
The `cosmocc` compiler is designed to generate deterministic output
|
||||||
|
across platforms. With this release we've confirmed that hello world
|
||||||
|
binary output is identical on Linux x86+Arm, MacOS x86+Arm, FreeBSD,
|
||||||
|
OpenBSD, and Windows. Please note that users who need reproducible
|
||||||
|
builds may also want to look into explicitly defining environment
|
||||||
|
variables like `LC_ALL=C` and `SOURCE_DATE_EPOCH=0`, in addition to
|
||||||
|
undefining macros such as `-U__DATE__` and `-U__TIME__`.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
@ -48,13 +59,15 @@ any particular system folder, and it needn't be added to your `$PATH`.
|
||||||
There's no external dependencies required to use this toolchain, other
|
There's no external dependencies required to use this toolchain, other
|
||||||
than the UNIX shell.
|
than the UNIX shell.
|
||||||
|
|
||||||
It's recommended that you install APE loader systemwide, rather than
|
It's recommended that the APE Loader be installed systemwide, rather
|
||||||
depending on the APE shell script to self-extract a user's own version.
|
than depending on the default behavior of the APE shell script, which is
|
||||||
Apple M1 users should compile `cc -o ape bin/ape-m1.c` and move `ape` to
|
to self-extract an APE loader to each user's `$TMPDIR` or `$HOME`. Apple
|
||||||
|
Arm64 users should compile `cc -O -o ape bin/ape-m1.c` and move `ape` to
|
||||||
`/usr/local/bin/ape`. All other platforms use `/usr/bin/ape` as the
|
`/usr/local/bin/ape`. All other platforms use `/usr/bin/ape` as the
|
||||||
canonical path. Linux and BSD users can simply copy `bin/ape.elf` to
|
canonical path. Linux and BSD users can simply copy `bin/ape.elf` to
|
||||||
`/usr/bin/ape`. MacOS x86-64 users will want `bin/ape.macho`. On Linux,
|
`/usr/bin/ape`. MacOS x86-64 users will want `bin/ape.macho`. On Linux,
|
||||||
it's also a good idea to have APE Loader registered with binfmt_misc.
|
it's possible to have APE executables run 400 microseconds faster by
|
||||||
|
registering APE with binfmt_misc.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo sh -c "echo ':APE:M::MZqFpD::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"
|
sudo sh -c "echo ':APE:M::MZqFpD::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"
|
||||||
|
@ -104,6 +117,136 @@ kinds of codebases using `cosmocc` which is just a convenient wrapper
|
||||||
around the cross compilers, which would be a better choice to use in
|
around the cross compilers, which would be a better choice to use in
|
||||||
this type of circumstance.
|
this type of circumstance.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
Your `cosmocc` compiler runs a number commands under the hood. If
|
||||||
|
something goes wrong, you can gain more visibility into its process by
|
||||||
|
setting the `BUILDLOG` environment variable.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
export BUILDLOG=log
|
||||||
|
bin/cosmocc -o hello hello.c
|
||||||
|
```
|
||||||
|
|
||||||
|
The log will then contain a log of commands you can copy and paste into
|
||||||
|
your shell to reproduce the build process, or simply see what flags are
|
||||||
|
being passed to the freestanding Linux compiler.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# bin/cosmocc -o hello hello.c
|
||||||
|
(cd /home/jart/cosmocc; bin/x86_64-linux-cosmo-gcc -o/tmp/fatcosmocc.i5lugr6bc0gu0.o -D__COSMOPOL...
|
||||||
|
(cd /home/jart/cosmocc; bin/aarch64-linux-cosmo-gcc -o/tmp/fatcosmocc.w48k03qgw8692.o -D__COSMOPO...
|
||||||
|
(cd /home/jart/cosmocc; bin/fixupobj /tmp/fatcosmocc.i5lugr6bc0gu0.o)
|
||||||
|
(cd /home/jart/cosmocc; bin/fixupobj /tmp/fatcosmocc.w48k03qgw8692.o)
|
||||||
|
(cd /home/jart/cosmocc; bin/x86_64-linux-cosmo-gcc -o/tmp/fatcosmocc.ovdo2nqvkjjg3.com.dbg c...
|
||||||
|
(cd /home/jart/cosmocc; bin/aarch64-linux-cosmo-gcc -o/tmp/fatcosmocc.d3ca1smuot0k0.aarch64.elf /...
|
||||||
|
(cd /home/jart/cosmocc; bin/fixupobj /tmp/fatcosmocc.d3ca1smuot0k0.aarch64.elf)
|
||||||
|
(cd /home/jart/cosmocc; bin/fixupobj /tmp/fatcosmocc.ovdo2nqvkjjg3.com.dbg)
|
||||||
|
(cd /home/jart/cosmocc; bin/apelink -l bin/ape.elf -l bin/ape.aarch64 -...
|
||||||
|
(cd /home/jart/cosmocc; bin/pecheck hello)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tools
|
||||||
|
|
||||||
|
While the GNU GCC and Binutils programs included in your `cosmocc`
|
||||||
|
toolchain require no explanation, other programs are included that many
|
||||||
|
users might not be familiar with.
|
||||||
|
|
||||||
|
### `assimilate`
|
||||||
|
|
||||||
|
The `assimilate` program may be used to convert actually portable
|
||||||
|
executables into native executables. By default, this tool converts to
|
||||||
|
the format used by the host operating system and architecture. However
|
||||||
|
flags may be passed to convert APE binaries for foreign platforms too.
|
||||||
|
|
||||||
|
### `ctags`
|
||||||
|
|
||||||
|
The `ctags` program is exuberant-ctags 1:5.9~svn20110310-14 built from
|
||||||
|
the Cosmopolitan Libc third_party sources. It may be used to generate an
|
||||||
|
index of symbols for your your text editor that enables easy source code
|
||||||
|
navigation.
|
||||||
|
|
||||||
|
### `apelink`
|
||||||
|
|
||||||
|
The `apelink` program is the actually portable executable linker. It
|
||||||
|
accepts as input (1) multiple executables that were linked by GNU
|
||||||
|
ld.bfd, (2) the paths of native APE Loader executables for ELF
|
||||||
|
platforms, and (3) the source code for the Apple Silicon APE loader. It
|
||||||
|
then weaves them all together into a shell script that self-extracts the
|
||||||
|
appropriate tiny ~10kb APE Loader, when is then re-exec'd to map the
|
||||||
|
bulk of the appropriate embedded executable into memory.
|
||||||
|
|
||||||
|
### `mkdeps`
|
||||||
|
|
||||||
|
The `mkdeps` program can be used to generate a deps file for your
|
||||||
|
Makefile, which declares which source files include which headers. This
|
||||||
|
command is impressively fast. Much more so than relying on `gcc -MMD`.
|
||||||
|
This was originally built for the Cosmopolitan Libc repository, which
|
||||||
|
has ~10,000 source files. Using `mkdeps`, Cosmo is able to generate an
|
||||||
|
`o//depend` file with ~100,000 lines in ~70 milliseconds.
|
||||||
|
|
||||||
|
It can be used by adding something like this to your `Makefile`.
|
||||||
|
|
||||||
|
```make
|
||||||
|
FILES := $(wildcard src/*)
|
||||||
|
SRCS = $(filter %.c,$(FILES))
|
||||||
|
HDRS = $(filter %.h,$(FILES))
|
||||||
|
|
||||||
|
o/$(MODE)/depend: $(SRCS) $(HDRS)
|
||||||
|
@mkdir -o $(@D)
|
||||||
|
mkdeps -o $@ -r o/$(MODE)/ $(SRCS) $(HDRS)
|
||||||
|
|
||||||
|
$(SRCS):
|
||||||
|
$(HDRS):
|
||||||
|
.DEFAULT:
|
||||||
|
@echo
|
||||||
|
@echo NOTE: deleting o/$(MODE)/depend because of an unspecified prerequisite: $@
|
||||||
|
@echo
|
||||||
|
rm -f o/$(MODE)/depend
|
||||||
|
|
||||||
|
-include o/$(MODE)/depend
|
||||||
|
```
|
||||||
|
|
||||||
|
If your project is very large like Cosmopolitan, then `mkdeps` supports
|
||||||
|
arguments files. That's particularly helpful on Windows, which has a
|
||||||
|
32768 character limit on command arguments.
|
||||||
|
|
||||||
|
```make
|
||||||
|
SRCS = $(foreach x,$(PKGS),$($(x)_SRCS))
|
||||||
|
HDRS = $(foreach x,$(PKGS),$($(x)_HDRS))
|
||||||
|
|
||||||
|
o/$(MODE)/depend: $(SRCS) $(HDRS)
|
||||||
|
$(file >$@.args,$(SRCS) $(HDRS))
|
||||||
|
@mkdir -o $(@D)
|
||||||
|
mkdeps -o $@ -r o/$(MODE)/ @$@.args
|
||||||
|
```
|
||||||
|
|
||||||
|
### `cosmoaddr2line`
|
||||||
|
|
||||||
|
The `cosmoaddr2line` program may be used to print backtraces, based on
|
||||||
|
DWARF data, whenever one of your programs reports a crash. It accepts as
|
||||||
|
an argument the ELF executable produced by `cosmocc`, which is different
|
||||||
|
from the APE executable. For example, if `cosmocc` compiles a program
|
||||||
|
named `hello` then you'll need to pass either `hello.com.dbg` (x86-64)
|
||||||
|
or `hello.aarch64.elf` to cosmoaddr2line to get the backtrace. After the
|
||||||
|
ELf executable comes the program counter (instruction pointer) addresses
|
||||||
|
which are easily obtained using `__builtin_frame_address(0)`. Cosmo can
|
||||||
|
make this easier in certain cases. The `ShowCrashReports()` feature may
|
||||||
|
print the `cosmoaddr2line` command you'll need to run, to get a better
|
||||||
|
backtrace. On Windows, the Cosmopolitan runtime will output the command
|
||||||
|
to the `--strace` log whenever your program dies due to a fatal signal
|
||||||
|
that's blocked or in the `SIG_DFL` disposition.
|
||||||
|
|
||||||
|
### `mktemper`
|
||||||
|
|
||||||
|
The `mktemper` command is a portable replacement for the traditional
|
||||||
|
`mktemp` command, which isn't available on platforms like MacOS. Our
|
||||||
|
version also offers improvements, such as formatting a 64-bit random
|
||||||
|
value obtained from a cryptographic `getrandom()` entropy source. Using
|
||||||
|
this command requires passing an argument such as
|
||||||
|
`/tmp/foo.XXXXXXXXXXXXX` where the X's are replaced by a random value.
|
||||||
|
The newly created file is then printed to standard output.
|
||||||
|
|
||||||
## About
|
## About
|
||||||
|
|
||||||
This toolchain is based on GCC. It's been modified too. We wrote a 2kLOC
|
This toolchain is based on GCC. It's been modified too. We wrote a 2kLOC
|
||||||
|
|
|
@ -15,7 +15,6 @@ make -j8 m= \
|
||||||
|
|
||||||
make -j8 m=x86_64 \
|
make -j8 m=x86_64 \
|
||||||
o/cosmocc.h.txt \
|
o/cosmocc.h.txt \
|
||||||
o/cosmopolitan.h.txt \
|
|
||||||
o/x86_64/ape/ape.lds \
|
o/x86_64/ape/ape.lds \
|
||||||
o/x86_64/libc/crt/crt.o \
|
o/x86_64/libc/crt/crt.o \
|
||||||
o/x86_64/ape/ape.elf \
|
o/x86_64/ape/ape.elf \
|
||||||
|
@ -33,7 +32,8 @@ make -j8 m=x86_64 \
|
||||||
o/x86_64/tool/build/mkdeps.com.dbg \
|
o/x86_64/tool/build/mkdeps.com.dbg \
|
||||||
o/x86_64/tool/build/apelink.com.dbg \
|
o/x86_64/tool/build/apelink.com.dbg \
|
||||||
o/x86_64/tool/build/pecheck.com.dbg \
|
o/x86_64/tool/build/pecheck.com.dbg \
|
||||||
o/x86_64/third_party/make/make.com.dbg
|
o/x86_64/third_party/make/make.com.dbg \
|
||||||
|
o/x86_64/third_party/ctags/ctags.com.dbg
|
||||||
|
|
||||||
make -j8 m=aarch64 \
|
make -j8 m=aarch64 \
|
||||||
o/aarch64/ape/ape.elf \
|
o/aarch64/ape/ape.elf \
|
||||||
|
@ -51,7 +51,8 @@ make -j8 m=aarch64 \
|
||||||
o/aarch64/tool/build/mkdeps.com.dbg \
|
o/aarch64/tool/build/mkdeps.com.dbg \
|
||||||
o/aarch64/tool/build/apelink.com.dbg \
|
o/aarch64/tool/build/apelink.com.dbg \
|
||||||
o/aarch64/tool/build/pecheck.com.dbg \
|
o/aarch64/tool/build/pecheck.com.dbg \
|
||||||
o/aarch64/third_party/make/make.com.dbg
|
o/aarch64/third_party/make/make.com.dbg \
|
||||||
|
o/aarch64/third_party/ctags/ctags.com.dbg
|
||||||
|
|
||||||
mkdir -p "$OUTDIR/bin/"
|
mkdir -p "$OUTDIR/bin/"
|
||||||
cp tool/cosmocc/README.md "$OUTDIR/"
|
cp tool/cosmocc/README.md "$OUTDIR/"
|
||||||
|
@ -60,7 +61,7 @@ cp tool/cosmocc/LICENSE.* "$OUTDIR/"
|
||||||
mkdir -p "$OUTDIR/include/"
|
mkdir -p "$OUTDIR/include/"
|
||||||
cp -R libc/isystem/* "$OUTDIR/include/"
|
cp -R libc/isystem/* "$OUTDIR/include/"
|
||||||
cp -R libc/integral "$OUTDIR/include/libc/"
|
cp -R libc/integral "$OUTDIR/include/libc/"
|
||||||
for x in $(cat o/cosmocc.h.txt o/cosmopolitan.h.txt); do
|
for x in $(cat o/cosmocc.h.txt); do
|
||||||
mkdir -p "$OUTDIR/include/${x%/*}/"
|
mkdir -p "$OUTDIR/include/${x%/*}/"
|
||||||
cp -f $x "$OUTDIR/include/${x%/*}/"
|
cp -f $x "$OUTDIR/include/${x%/*}/"
|
||||||
done
|
done
|
||||||
|
@ -68,12 +69,12 @@ done
|
||||||
OLD=$PWD
|
OLD=$PWD
|
||||||
cd "$OUTDIR/"
|
cd "$OUTDIR/"
|
||||||
if [ ! -x bin/x86_64-linux-cosmo-gcc ]; then
|
if [ ! -x bin/x86_64-linux-cosmo-gcc ]; then
|
||||||
wget https://cosmo.zip/pub/cosmocc/cosmocc-0.0.18.zip
|
wget https://github.com/ahgamut/superconfigure/releases/download/z0.0.18/aarch64-gcc.zip
|
||||||
unzip cosmocc-0.0.18.zip
|
unzip aarch64-gcc.zip
|
||||||
cp -af o/third_party/gcc/bin/* bin/
|
rm -f aarch64-gcc.zip
|
||||||
cp -aR o/third_party/gcc/libexec .
|
wget https://github.com/ahgamut/superconfigure/releases/download/z0.0.18/x86_64-gcc.zip
|
||||||
rm -f cosmocc-0.0.18.zip
|
unzip x86_64-gcc.zip
|
||||||
rm -rf o/
|
rm -f x86_64-gcc.zip
|
||||||
fi
|
fi
|
||||||
rm -f bin/*-cpp
|
rm -f bin/*-cpp
|
||||||
rm -f bin/*-gcc-*
|
rm -f bin/*-gcc-*
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include "libc/calls/struct/winsize.h"
|
#include "libc/calls/struct/winsize.h"
|
||||||
#include "libc/calls/termios.h"
|
#include "libc/calls/termios.h"
|
||||||
#include "libc/calls/ucontext.h"
|
#include "libc/calls/ucontext.h"
|
||||||
|
#include "libc/cxxabi.h"
|
||||||
#include "libc/dns/dns.h"
|
#include "libc/dns/dns.h"
|
||||||
#include "libc/errno.h"
|
#include "libc/errno.h"
|
||||||
#include "libc/fmt/conv.h"
|
#include "libc/fmt/conv.h"
|
||||||
|
@ -1586,7 +1587,7 @@ int main(int argc, char *argv[]) {
|
||||||
xsigaction(SIGCHLD, OnSigChld, 0, 0, NULL);
|
xsigaction(SIGCHLD, OnSigChld, 0, 0, NULL);
|
||||||
xsigaction(SIGPIPE, OnSigPipe, 0, 0, NULL);
|
xsigaction(SIGPIPE, OnSigPipe, 0, 0, NULL);
|
||||||
if (ttyraw(kTtyLfToCrLf) != -1) ttymode_ = true;
|
if (ttyraw(kTtyLfToCrLf) != -1) ttymode_ = true;
|
||||||
__cxa_atexit(OnExit, NULL, NULL);
|
__cxa_atexit((void *)OnExit, NULL, NULL);
|
||||||
__log_file = fopen(logpath_, "a");
|
__log_file = fopen(logpath_, "a");
|
||||||
if (ischardev(infd_) && ischardev(outfd_)) {
|
if (ischardev(infd_) && ischardev(outfd_)) {
|
||||||
/* CHECK_NE(-1, fcntl(infd_, F_SETFL, O_NONBLOCK)); */
|
/* CHECK_NE(-1, fcntl(infd_, F_SETFL, O_NONBLOCK)); */
|
||||||
|
|
Loading…
Reference in a new issue