mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 03:27:39 +00:00
Clean up more code
- Found some bugs in LLVM compiler-rt library - The useless LIBC_STUBS package is now deleted - Improve the overflow checking story even further - Get chibicc tests working in MODE=dbg mode again - The libc/isystem/ headers now have correctly named guards
This commit is contained in:
parent
afc58a8b41
commit
d7c79f43ef
294 changed files with 912 additions and 1208 deletions
4
Makefile
4
Makefile
|
@ -113,8 +113,7 @@ include build/functions.mk #─┐
|
||||||
include build/definitions.mk # ├──META
|
include build/definitions.mk # ├──META
|
||||||
include build/config.mk # │ You can build
|
include build/config.mk # │ You can build
|
||||||
include build/rules.mk # │ You can topologically order
|
include build/rules.mk # │ You can topologically order
|
||||||
include build/online.mk # │
|
include build/online.mk #─┘
|
||||||
include libc/stubs/stubs.mk #─┘
|
|
||||||
include libc/nexgen32e/nexgen32e.mk #─┐
|
include libc/nexgen32e/nexgen32e.mk #─┐
|
||||||
include libc/sysv/sysv.mk # ├──SYSTEM SUPPORT
|
include libc/sysv/sysv.mk # ├──SYSTEM SUPPORT
|
||||||
include libc/nt/nt.mk # │ You can do math
|
include libc/nt/nt.mk # │ You can do math
|
||||||
|
@ -214,7 +213,6 @@ include tool/lambda/lambda.mk
|
||||||
include tool/plinko/lib/lib.mk
|
include tool/plinko/lib/lib.mk
|
||||||
include tool/plinko/plinko.mk
|
include tool/plinko/plinko.mk
|
||||||
include test/tool/plinko/test.mk
|
include test/tool/plinko/test.mk
|
||||||
include tool/hash/hash.mk
|
|
||||||
include tool/net/net.mk
|
include tool/net/net.mk
|
||||||
include tool/viz/viz.mk
|
include tool/viz/viz.mk
|
||||||
include tool/tool.mk
|
include tool/tool.mk
|
||||||
|
|
|
@ -25,8 +25,7 @@ DSP_BMP_A_CHECKS = \
|
||||||
|
|
||||||
DSP_BMP_A_DIRECTDEPS = \
|
DSP_BMP_A_DIRECTDEPS = \
|
||||||
LIBC_NEXGEN32E \
|
LIBC_NEXGEN32E \
|
||||||
LIBC_TINYMATH \
|
LIBC_TINYMATH
|
||||||
LIBC_STUBS
|
|
||||||
|
|
||||||
DSP_BMP_A_DEPS := \
|
DSP_BMP_A_DEPS := \
|
||||||
$(call uniq,$(foreach x,$(DSP_BMP_A_DIRECTDEPS),$($(x))))
|
$(call uniq,$(foreach x,$(DSP_BMP_A_DIRECTDEPS),$($(x))))
|
||||||
|
|
|
@ -20,8 +20,7 @@ DSP_CORE_A_DIRECTDEPS = \
|
||||||
LIBC_MEM \
|
LIBC_MEM \
|
||||||
LIBC_NEXGEN32E \
|
LIBC_NEXGEN32E \
|
||||||
LIBC_STR \
|
LIBC_STR \
|
||||||
LIBC_TINYMATH \
|
LIBC_TINYMATH
|
||||||
LIBC_STUBS
|
|
||||||
|
|
||||||
DSP_CORE_A_DEPS := \
|
DSP_CORE_A_DEPS := \
|
||||||
$(call uniq,$(foreach x,$(DSP_CORE_A_DIRECTDEPS),$($(x))))
|
$(call uniq,$(foreach x,$(DSP_CORE_A_DIRECTDEPS),$($(x))))
|
||||||
|
|
|
@ -34,7 +34,6 @@ DSP_MPEG_A_DIRECTDEPS = \
|
||||||
LIBC_RUNTIME \
|
LIBC_RUNTIME \
|
||||||
LIBC_STDIO \
|
LIBC_STDIO \
|
||||||
LIBC_STR \
|
LIBC_STR \
|
||||||
LIBC_STUBS \
|
|
||||||
LIBC_SYSV \
|
LIBC_SYSV \
|
||||||
LIBC_TIME \
|
LIBC_TIME \
|
||||||
LIBC_TINYMATH \
|
LIBC_TINYMATH \
|
||||||
|
|
|
@ -31,8 +31,6 @@ DSP_SCALE_A_DIRECTDEPS = \
|
||||||
LIBC_NEXGEN32E \
|
LIBC_NEXGEN32E \
|
||||||
LIBC_RUNTIME \
|
LIBC_RUNTIME \
|
||||||
LIBC_STR \
|
LIBC_STR \
|
||||||
LIBC_STUBS \
|
|
||||||
LIBC_STUBS \
|
|
||||||
LIBC_TIME \
|
LIBC_TIME \
|
||||||
LIBC_TINYMATH \
|
LIBC_TINYMATH \
|
||||||
LIBC_X
|
LIBC_X
|
||||||
|
|
|
@ -35,7 +35,6 @@ DSP_TTY_A_DIRECTDEPS = \
|
||||||
LIBC_NT_KERNEL32 \
|
LIBC_NT_KERNEL32 \
|
||||||
LIBC_STR \
|
LIBC_STR \
|
||||||
LIBC_STDIO \
|
LIBC_STDIO \
|
||||||
LIBC_STUBS \
|
|
||||||
LIBC_SOCK \
|
LIBC_SOCK \
|
||||||
LIBC_SYSV \
|
LIBC_SYSV \
|
||||||
LIBC_TINYMATH \
|
LIBC_TINYMATH \
|
||||||
|
|
|
@ -7,10 +7,10 @@
|
||||||
│ • http://creativecommons.org/publicdomain/zero/1.0/ │
|
│ • http://creativecommons.org/publicdomain/zero/1.0/ │
|
||||||
╚─────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────*/
|
||||||
#endif
|
#endif
|
||||||
|
#include "libc/calls/calls.h"
|
||||||
#include "libc/calls/struct/timespec.h"
|
#include "libc/calls/struct/timespec.h"
|
||||||
#include "libc/runtime/runtime.h"
|
#include "libc/runtime/runtime.h"
|
||||||
#include "libc/stdio/stdio.h"
|
#include "libc/stdio/stdio.h"
|
||||||
#include "libc/time/time.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @fileoverview clock() function demo
|
* @fileoverview clock() function demo
|
||||||
|
|
|
@ -59,7 +59,6 @@ EXAMPLES_DIRECTDEPS = \
|
||||||
LIBC_SOCK \
|
LIBC_SOCK \
|
||||||
LIBC_STDIO \
|
LIBC_STDIO \
|
||||||
LIBC_STR \
|
LIBC_STR \
|
||||||
LIBC_STUBS \
|
|
||||||
LIBC_SYSV \
|
LIBC_SYSV \
|
||||||
LIBC_SYSV_CALLS \
|
LIBC_SYSV_CALLS \
|
||||||
LIBC_TESTLIB \
|
LIBC_TESTLIB \
|
||||||
|
@ -77,10 +76,10 @@ EXAMPLES_DIRECTDEPS = \
|
||||||
THIRD_PARTY_DOUBLECONVERSION \
|
THIRD_PARTY_DOUBLECONVERSION \
|
||||||
THIRD_PARTY_GDTOA \
|
THIRD_PARTY_GDTOA \
|
||||||
THIRD_PARTY_GETOPT \
|
THIRD_PARTY_GETOPT \
|
||||||
|
THIRD_PARTY_HIREDIS \
|
||||||
THIRD_PARTY_LIBCXX \
|
THIRD_PARTY_LIBCXX \
|
||||||
THIRD_PARTY_LINENOISE \
|
THIRD_PARTY_LINENOISE \
|
||||||
THIRD_PARTY_LUA \
|
THIRD_PARTY_LUA \
|
||||||
THIRD_PARTY_HIREDIS \
|
|
||||||
THIRD_PARTY_MBEDTLS \
|
THIRD_PARTY_MBEDTLS \
|
||||||
THIRD_PARTY_MUSL \
|
THIRD_PARTY_MUSL \
|
||||||
THIRD_PARTY_NSYNC \
|
THIRD_PARTY_NSYNC \
|
||||||
|
|
|
@ -43,7 +43,6 @@ EXAMPLES_PACKAGE_DIRECTDEPS = \
|
||||||
EXAMPLES_PACKAGE_LIB \
|
EXAMPLES_PACKAGE_LIB \
|
||||||
LIBC_INTRIN \
|
LIBC_INTRIN \
|
||||||
LIBC_STDIO \
|
LIBC_STDIO \
|
||||||
LIBC_STUBS \
|
|
||||||
LIBC_TINYMATH
|
LIBC_TINYMATH
|
||||||
|
|
||||||
# Evaluates the set of transitive package dependencies.
|
# Evaluates the set of transitive package dependencies.
|
||||||
|
|
|
@ -69,10 +69,9 @@ EXAMPLES_PACKAGE_LIB_A_CHECKS = \
|
||||||
# Lists packages whose symbols are or may be directly referenced here.
|
# Lists packages whose symbols are or may be directly referenced here.
|
||||||
# Note that linking stubs is always a good idea due to synthetic code.
|
# Note that linking stubs is always a good idea due to synthetic code.
|
||||||
EXAMPLES_PACKAGE_LIB_A_DIRECTDEPS = \
|
EXAMPLES_PACKAGE_LIB_A_DIRECTDEPS = \
|
||||||
LIBC_STDIO \
|
|
||||||
LIBC_INTRIN \
|
LIBC_INTRIN \
|
||||||
LIBC_NEXGEN32E \
|
LIBC_NEXGEN32E \
|
||||||
LIBC_STUBS
|
LIBC_STDIO
|
||||||
|
|
||||||
# Evaluates variable as set of transitive package dependencies.
|
# Evaluates variable as set of transitive package dependencies.
|
||||||
EXAMPLES_PACKAGE_LIB_A_DEPS := \
|
EXAMPLES_PACKAGE_LIB_A_DEPS := \
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
#include "libc/dns/dns.h"
|
#include "libc/dns/dns.h"
|
||||||
#include "libc/errno.h"
|
#include "libc/errno.h"
|
||||||
#include "libc/log/bsd.h"
|
#include "libc/log/bsd.h"
|
||||||
#include "libc/mem/fmt.h"
|
|
||||||
#include "libc/mem/mem.h"
|
#include "libc/mem/mem.h"
|
||||||
#include "libc/runtime/runtime.h"
|
#include "libc/runtime/runtime.h"
|
||||||
#include "libc/sock/struct/pollfd.h"
|
#include "libc/sock/struct/pollfd.h"
|
||||||
|
|
|
@ -40,6 +40,8 @@
|
||||||
#define SIG_DFL ((void (*)(int))0)
|
#define SIG_DFL ((void (*)(int))0)
|
||||||
#define SIG_IGN ((void (*)(int))1)
|
#define SIG_IGN ((void (*)(int))1)
|
||||||
|
|
||||||
|
#define CLOCKS_PER_SEC 1000000L
|
||||||
|
|
||||||
#define MAP_FAILED ((void *)-1)
|
#define MAP_FAILED ((void *)-1)
|
||||||
|
|
||||||
#define WCOREDUMP(s) (128 & (s))
|
#define WCOREDUMP(s) (128 & (s))
|
||||||
|
@ -174,6 +176,8 @@ int usleep(unsigned);
|
||||||
int vfork(void) returnstwice;
|
int vfork(void) returnstwice;
|
||||||
int wait(int *);
|
int wait(int *);
|
||||||
int waitpid(int, int *, int);
|
int waitpid(int, int *, int);
|
||||||
|
int64_t clock(void);
|
||||||
|
int64_t time(int64_t *);
|
||||||
ssize_t copy_file_range(int, long *, int, long *, size_t, unsigned);
|
ssize_t copy_file_range(int, long *, int, long *, size_t, unsigned);
|
||||||
ssize_t lseek(int, int64_t, int);
|
ssize_t lseek(int, int64_t, int);
|
||||||
ssize_t pread(int, void *, size_t, int64_t);
|
ssize_t pread(int, void *, size_t, int64_t);
|
||||||
|
@ -183,10 +187,12 @@ ssize_t readlink(const char *, char *, size_t);
|
||||||
ssize_t readlinkat(int, const char *, char *, size_t);
|
ssize_t readlinkat(int, const char *, char *, size_t);
|
||||||
ssize_t splice(int, int64_t *, int, int64_t *, size_t, unsigned);
|
ssize_t splice(int, int64_t *, int, int64_t *, size_t, unsigned);
|
||||||
ssize_t write(int, const void *, size_t);
|
ssize_t write(int, const void *, size_t);
|
||||||
|
unsigned alarm(unsigned);
|
||||||
unsigned getegid(void) nosideeffect;
|
unsigned getegid(void) nosideeffect;
|
||||||
unsigned geteuid(void) nosideeffect;
|
unsigned geteuid(void) nosideeffect;
|
||||||
unsigned getgid(void) nosideeffect;
|
unsigned getgid(void) nosideeffect;
|
||||||
unsigned getuid(void) libcesque;
|
unsigned getuid(void) libcesque;
|
||||||
|
unsigned sleep(unsigned);
|
||||||
unsigned umask(unsigned);
|
unsigned umask(unsigned);
|
||||||
void sync(void);
|
void sync(void);
|
||||||
|
|
||||||
|
|
|
@ -45,13 +45,12 @@ LIBC_CALLS_A_DIRECTDEPS = \
|
||||||
LIBC_NT_KERNEL32 \
|
LIBC_NT_KERNEL32 \
|
||||||
LIBC_NT_NTDLL \
|
LIBC_NT_NTDLL \
|
||||||
LIBC_NT_PDH \
|
LIBC_NT_PDH \
|
||||||
LIBC_NT_PSAPI \
|
|
||||||
LIBC_NT_POWRPROF \
|
LIBC_NT_POWRPROF \
|
||||||
|
LIBC_NT_PSAPI \
|
||||||
LIBC_NT_WS2_32 \
|
LIBC_NT_WS2_32 \
|
||||||
LIBC_STR \
|
LIBC_STR \
|
||||||
LIBC_STUBS \
|
|
||||||
LIBC_SYSV_CALLS \
|
|
||||||
LIBC_SYSV \
|
LIBC_SYSV \
|
||||||
|
LIBC_SYSV_CALLS \
|
||||||
THIRD_PARTY_COMPILER_RT
|
THIRD_PARTY_COMPILER_RT
|
||||||
|
|
||||||
LIBC_CALLS_A_DEPS := \
|
LIBC_CALLS_A_DEPS := \
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/calls/calls.h"
|
#include "libc/calls/calls.h"
|
||||||
#include "libc/macros.internal.h"
|
#include "libc/macros.internal.h"
|
||||||
|
#include "libc/runtime/runtime.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copies data between file descriptors the old fashioned way.
|
* Copies data between file descriptors the old fashioned way.
|
||||||
|
@ -43,7 +44,7 @@ ssize_t copyfd(int in, int out, size_t n) {
|
||||||
if (dw != dr) {
|
if (dw != dr) {
|
||||||
// POSIX requires atomic IO up to PIPE_BUF
|
// POSIX requires atomic IO up to PIPE_BUF
|
||||||
// The minimum permissible PIPE_BUF is 512
|
// The minimum permissible PIPE_BUF is 512
|
||||||
__builtin_trap();
|
abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return i;
|
return i;
|
||||||
|
|
|
@ -33,6 +33,8 @@
|
||||||
#include "libc/thread/tls.h"
|
#include "libc/thread/tls.h"
|
||||||
#include "libc/time/time.h"
|
#include "libc/time/time.h"
|
||||||
|
|
||||||
|
// TODO(jart): DELETE
|
||||||
|
|
||||||
static clock_gettime_f *__gettime;
|
static clock_gettime_f *__gettime;
|
||||||
|
|
||||||
static struct Now {
|
static struct Now {
|
||||||
|
|
|
@ -31,6 +31,8 @@
|
||||||
#include "libc/thread/tls.h"
|
#include "libc/thread/tls.h"
|
||||||
#include "libc/time/time.h"
|
#include "libc/time/time.h"
|
||||||
|
|
||||||
|
// TODO(jart): DELETE
|
||||||
|
|
||||||
static struct Now {
|
static struct Now {
|
||||||
bool once;
|
bool once;
|
||||||
uint64_t k0;
|
uint64_t k0;
|
||||||
|
|
|
@ -6,44 +6,44 @@
|
||||||
* @fileoverview Types we'd prefer hadn't been invented.
|
* @fileoverview Types we'd prefer hadn't been invented.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define blkcnt_t int64_t
|
typedef int64_t blkcnt_t;
|
||||||
#define cc_t uint8_t
|
typedef uint8_t cc_t;
|
||||||
#define clock_t int64_t /* uint64_t on xnu */
|
typedef int64_t clock_t; /* uint64_t on xnu */
|
||||||
#define dev_t uint64_t /* int32_t on xnu */
|
typedef uint64_t dev_t; /* int32_t on xnu */
|
||||||
#define fsblkcnt_t uint64_t
|
typedef uint64_t fsblkcnt_t;
|
||||||
#define fsfilcnt_t int64_t /* uint32_t on xnu */
|
typedef int64_t fsfilcnt_t; /* uint32_t on xnu */
|
||||||
#define gid_t uint32_t
|
typedef uint32_t gid_t;
|
||||||
#define id_t uint32_t /* int32_t on linux/freebsd/etc. */
|
typedef uint32_t id_t; /* int32_t on linux/freebsd/etc. */
|
||||||
#define in_addr_t uint32_t
|
typedef uint32_t in_addr_t;
|
||||||
#define in_addr_t uint32_t
|
typedef uint32_t in_addr_t;
|
||||||
#define in_port_t uint16_t
|
typedef uint16_t in_port_t;
|
||||||
#define ino_t uint64_t
|
typedef uint64_t ino_t;
|
||||||
#define key_t int32_t
|
typedef int32_t key_t;
|
||||||
#define loff_t int64_t
|
typedef int64_t loff_t;
|
||||||
#define mode_t uint32_t /* uint16_t on xnu */
|
typedef uint32_t mode_t; /* uint16_t on xnu */
|
||||||
#define nfds_t uint64_t
|
typedef uint64_t nfds_t;
|
||||||
#define off_t int64_t
|
typedef int64_t off_t;
|
||||||
#define pid_t int32_t
|
typedef int32_t pid_t;
|
||||||
#define register_t int64_t
|
typedef int64_t register_t;
|
||||||
#define sa_family_t uint16_t /* bsd:uint8_t */
|
typedef uint16_t sa_family_t; /* bsd:uint8_t */
|
||||||
#define socklen_t uint32_t
|
typedef uint32_t socklen_t;
|
||||||
#define speed_t uint32_t
|
typedef uint32_t speed_t;
|
||||||
#define suseconds_t int64_t /* int32_t on xnu */
|
typedef int64_t suseconds_t; /* int32_t on xnu */
|
||||||
#define useconds_t uint64_t /* uint32_t on xnu */
|
typedef uint64_t useconds_t; /* uint32_t on xnu */
|
||||||
#define syscall_arg_t int64_t /* uint64_t on xnu */
|
typedef int64_t syscall_arg_t; /* uint64_t on xnu */
|
||||||
#define tcflag_t uint32_t
|
typedef uint32_t tcflag_t;
|
||||||
#define time_t int64_t
|
typedef int64_t time_t;
|
||||||
#define timer_t void*
|
typedef void *timer_t;
|
||||||
#define uid_t uint32_t
|
typedef uint32_t uid_t;
|
||||||
#define rlim_t uint64_t /* int64_t on bsd */
|
typedef uint64_t rlim_t; /* int64_t on bsd */
|
||||||
#define clockid_t int32_t
|
typedef int32_t clockid_t;
|
||||||
|
|
||||||
#ifdef __x86_64__
|
#ifdef __x86_64__
|
||||||
#define blksize_t int64_t /* int32_t on xnu */
|
typedef int64_t blksize_t; /* int32_t on xnu */
|
||||||
#define nlink_t uint64_t
|
typedef uint64_t nlink_t;
|
||||||
#elif defined(__aarch64__)
|
#elif defined(__aarch64__)
|
||||||
#define blksize_t int32_t
|
typedef int32_t blksize_t;
|
||||||
#define nlink_t uint32_t /* uint16_t on xnu */
|
typedef uint32_t nlink_t; /* uint16_t on xnu */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TIME_T_MAX __INT64_MAX__
|
#define TIME_T_MAX __INT64_MAX__
|
||||||
|
|
|
@ -26,17 +26,16 @@ LIBC_DNS_A_CHECKS = \
|
||||||
LIBC_DNS_A_DIRECTDEPS = \
|
LIBC_DNS_A_DIRECTDEPS = \
|
||||||
LIBC_CALLS \
|
LIBC_CALLS \
|
||||||
LIBC_FMT \
|
LIBC_FMT \
|
||||||
|
LIBC_INTRIN \
|
||||||
LIBC_MEM \
|
LIBC_MEM \
|
||||||
LIBC_NEXGEN32E \
|
LIBC_NEXGEN32E \
|
||||||
|
LIBC_NT_ADVAPI32 \
|
||||||
|
LIBC_NT_KERNEL32 \
|
||||||
LIBC_RUNTIME \
|
LIBC_RUNTIME \
|
||||||
LIBC_SOCK \
|
LIBC_SOCK \
|
||||||
LIBC_STDIO \
|
LIBC_STDIO \
|
||||||
LIBC_INTRIN \
|
|
||||||
LIBC_STUBS \
|
|
||||||
LIBC_STR \
|
LIBC_STR \
|
||||||
LIBC_SYSV \
|
LIBC_SYSV
|
||||||
LIBC_NT_ADVAPI32 \
|
|
||||||
LIBC_NT_KERNEL32
|
|
||||||
|
|
||||||
LIBC_DNS_A_DEPS := \
|
LIBC_DNS_A_DEPS := \
|
||||||
$(call uniq,$(foreach x,$(LIBC_DNS_A_DIRECTDEPS),$($(x))))
|
$(call uniq,$(foreach x,$(LIBC_DNS_A_DIRECTDEPS),$($(x))))
|
||||||
|
|
|
@ -4,30 +4,23 @@
|
||||||
#include "libc/elf/struct/phdr.h"
|
#include "libc/elf/struct/phdr.h"
|
||||||
#include "libc/elf/struct/shdr.h"
|
#include "libc/elf/struct/shdr.h"
|
||||||
#include "libc/elf/struct/sym.h"
|
#include "libc/elf/struct/sym.h"
|
||||||
#include "libc/runtime/ezmap.internal.h"
|
|
||||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||||
COSMOPOLITAN_C_START_
|
COSMOPOLITAN_C_START_
|
||||||
#ifdef COSMO
|
#ifdef COSMO
|
||||||
|
|
||||||
/*───────────────────────────────────────────────────────────────────────────│─╗
|
/*───────────────────────────────────────────────────────────────────────────│─╗
|
||||||
│ cosmopolitan § executable & linkable format ─╬─│┼
|
│ cosmopolitan § executable linkable format ─╬─│┼
|
||||||
╚────────────────────────────────────────────────────────────────────────────│*/
|
╚────────────────────────────────────────────────────────────────────────────│*/
|
||||||
|
|
||||||
char *GetElfStringTable(const Elf64_Ehdr *, size_t);
|
char *GetElfStringTable(const Elf64_Ehdr *, size_t, const char *);
|
||||||
char *GetElfStrs(const Elf64_Ehdr *, size_t, size_t *);
|
Elf64_Sym *GetElfSymbolTable(const Elf64_Ehdr *, size_t, int, Elf64_Xword *);
|
||||||
Elf64_Sym *GetElfSymbolTable(const Elf64_Ehdr *, size_t, Elf64_Xword *);
|
|
||||||
bool IsElf64Binary(const Elf64_Ehdr *, size_t);
|
bool IsElf64Binary(const Elf64_Ehdr *, size_t);
|
||||||
bool IsElfSymbolContent(const Elf64_Sym *);
|
bool IsElfSymbolContent(const Elf64_Sym *);
|
||||||
Elf64_Phdr *GetElfSegmentHeaderAddress(const Elf64_Ehdr *, size_t, Elf64_Half);
|
Elf64_Phdr *GetElfProgramHeaderAddress(const Elf64_Ehdr *, size_t, Elf64_Half);
|
||||||
Elf64_Shdr *GetElfSectionHeaderAddress(const Elf64_Ehdr *, size_t, Elf64_Half);
|
Elf64_Shdr *GetElfSectionHeaderAddress(const Elf64_Ehdr *, size_t, Elf64_Half);
|
||||||
void *GetElfSectionAddress(const Elf64_Ehdr *, size_t, const Elf64_Shdr *);
|
void *GetElfSectionAddress(const Elf64_Ehdr *, size_t, const Elf64_Shdr *);
|
||||||
char *GetElfSectionNameStringTable(const Elf64_Ehdr *, size_t);
|
char *GetElfSectionNameStringTable(const Elf64_Ehdr *, size_t);
|
||||||
void GetElfVirtualAddressRange(const Elf64_Ehdr *, size_t, intptr_t *,
|
|
||||||
intptr_t *);
|
|
||||||
char *GetElfString(const Elf64_Ehdr *, size_t, const char *, Elf64_Word);
|
char *GetElfString(const Elf64_Ehdr *, size_t, const char *, Elf64_Word);
|
||||||
const char *GetElfSectionName(const Elf64_Ehdr *, size_t, Elf64_Shdr *);
|
const char *GetElfSectionName(const Elf64_Ehdr *, size_t, Elf64_Shdr *);
|
||||||
Elf64_Sym *GetElfDynSymbolTable(const Elf64_Ehdr *, size_t, Elf64_Xword *);
|
|
||||||
char *GetElfDynStringTable(const Elf64_Ehdr *, size_t);
|
|
||||||
|
|
||||||
#endif /* COSMO */
|
#endif /* COSMO */
|
||||||
COSMOPOLITAN_C_END_
|
COSMOPOLITAN_C_END_
|
||||||
|
|
|
@ -27,7 +27,6 @@ LIBC_ELF_A_DIRECTDEPS = \
|
||||||
LIBC_INTRIN \
|
LIBC_INTRIN \
|
||||||
LIBC_NEXGEN32E \
|
LIBC_NEXGEN32E \
|
||||||
LIBC_STR \
|
LIBC_STR \
|
||||||
LIBC_STUBS
|
|
||||||
|
|
||||||
LIBC_ELF_A_DEPS := \
|
LIBC_ELF_A_DEPS := \
|
||||||
$(call uniq,$(foreach x,$(LIBC_ELF_A_DIRECTDEPS),$($(x))))
|
$(call uniq,$(foreach x,$(LIBC_ELF_A_DIRECTDEPS),$($(x))))
|
||||||
|
|
|
@ -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 │
|
|
||||||
│ │
|
|
||||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
|
||||||
│ any purpose with or without fee is hereby granted, provided that the │
|
|
||||||
│ above copyright notice and this permission notice appear in all copies. │
|
|
||||||
│ │
|
|
||||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
|
||||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
|
||||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
|
||||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
|
||||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
|
||||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
|
||||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
|
||||||
#include "libc/elf/def.h"
|
|
||||||
#include "libc/elf/elf.h"
|
|
||||||
#include "libc/str/str.h"
|
|
||||||
|
|
||||||
char *GetElfDynStringTable(const Elf64_Ehdr *elf, size_t mapsize) {
|
|
||||||
int i;
|
|
||||||
char *name;
|
|
||||||
Elf64_Shdr *shdr;
|
|
||||||
for (i = 0; i < elf->e_shnum; ++i) {
|
|
||||||
if ((shdr = GetElfSectionHeaderAddress(elf, mapsize, i)) &&
|
|
||||||
shdr->sh_type == SHT_STRTAB &&
|
|
||||||
(name = GetElfSectionName(elf, mapsize, shdr)) &&
|
|
||||||
!strcmp(name, ".dynstr")) {
|
|
||||||
return GetElfSectionAddress(elf, mapsize, shdr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,35 +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 │
|
|
||||||
│ │
|
|
||||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
|
||||||
│ any purpose with or without fee is hereby granted, provided that the │
|
|
||||||
│ above copyright notice and this permission notice appear in all copies. │
|
|
||||||
│ │
|
|
||||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
|
||||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
|
||||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
|
||||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
|
||||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
|
||||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
|
||||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
|
||||||
#include "libc/elf/def.h"
|
|
||||||
#include "libc/elf/elf.h"
|
|
||||||
|
|
||||||
Elf64_Sym *GetElfDynSymbolTable(const Elf64_Ehdr *elf, size_t mapsize,
|
|
||||||
Elf64_Xword *out_count) {
|
|
||||||
int i;
|
|
||||||
Elf64_Shdr *shdr;
|
|
||||||
for (i = elf->e_shnum; i-- > 0;) {
|
|
||||||
if ((shdr = GetElfSectionHeaderAddress(elf, mapsize, i)) && //
|
|
||||||
shdr->sh_type == SHT_DYNSYM && //
|
|
||||||
shdr->sh_entsize == sizeof(Elf64_Sym)) {
|
|
||||||
if (out_count) *out_count = shdr->sh_size / sizeof(Elf64_Sym);
|
|
||||||
return GetElfSectionAddress(elf, mapsize, shdr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -17,16 +17,25 @@
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/elf/elf.h"
|
#include "libc/elf/elf.h"
|
||||||
#include "libc/stdckdint.h"
|
#include "libc/elf/scalar.h"
|
||||||
|
#include "libc/elf/struct/phdr.h"
|
||||||
|
|
||||||
Elf64_Phdr *GetElfSegmentHeaderAddress(const Elf64_Ehdr *elf, //
|
/**
|
||||||
|
* Returns program header at `elf.phdr[i]`.
|
||||||
|
*
|
||||||
|
* @param elf points to the start of the executable image
|
||||||
|
* @param mapsize is the number of bytes past `elf` we can access
|
||||||
|
* @param i is the program header index, starting at zero
|
||||||
|
* @return program header pointer, or null on error
|
||||||
|
*/
|
||||||
|
Elf64_Phdr *GetElfProgramHeaderAddress(const Elf64_Ehdr *elf, //
|
||||||
size_t mapsize, //
|
size_t mapsize, //
|
||||||
Elf64_Half i) { //
|
Elf64_Half i) { //
|
||||||
uint64_t last, addr;
|
uint64_t off;
|
||||||
if (i >= elf->e_phnum) return 0;
|
if (i >= elf->e_phnum) return 0;
|
||||||
if (ckd_add(&addr, (uintptr_t)elf, elf->e_phoff)) return 0;
|
if (elf->e_phoff <= 0) return 0;
|
||||||
if (ckd_add(&addr, addr, (unsigned)i * elf->e_phentsize)) return 0;
|
if (elf->e_phoff >= mapsize) return 0;
|
||||||
if (ckd_add(&last, addr, elf->e_phentsize)) return 0;
|
if (elf->e_phentsize < sizeof(Elf64_Phdr)) return 0;
|
||||||
if (last > (uintptr_t)elf + mapsize) return 0;
|
if ((off = elf->e_phoff + (unsigned)i * elf->e_phentsize) > mapsize) return 0;
|
||||||
return (Elf64_Phdr *)addr;
|
return (Elf64_Phdr *)((char *)elf + off);
|
||||||
}
|
}
|
|
@ -19,14 +19,23 @@
|
||||||
#include "libc/elf/elf.h"
|
#include "libc/elf/elf.h"
|
||||||
#include "libc/stdckdint.h"
|
#include "libc/stdckdint.h"
|
||||||
|
|
||||||
// note: should not be used on bss section
|
/**
|
||||||
|
* Returns pointer to elf section file content.
|
||||||
|
*
|
||||||
|
* This function shouldn't be used on the bss section.
|
||||||
|
*
|
||||||
|
* @param elf points to the start of the executable image
|
||||||
|
* @param mapsize is the number of bytes past `elf` we can access
|
||||||
|
* @param shdr is from GetElfSectionHeaderAddress() and null-propagating
|
||||||
|
* @return pointer to content bytes, or null on error
|
||||||
|
*/
|
||||||
void *GetElfSectionAddress(const Elf64_Ehdr *elf, // validated
|
void *GetElfSectionAddress(const Elf64_Ehdr *elf, // validated
|
||||||
size_t mapsize, // validated
|
size_t mapsize, // validated
|
||||||
const Elf64_Shdr *shdr) { // foreign
|
const Elf64_Shdr *shdr) { // foreign
|
||||||
uint64_t addr, last;
|
uint64_t last;
|
||||||
if (!shdr) return 0;
|
if (!shdr) return 0;
|
||||||
if (ckd_add(&addr, (uintptr_t)elf, shdr->sh_offset)) return 0;
|
if (shdr->sh_size <= 0) return 0;
|
||||||
if (ckd_add(&last, addr, shdr->sh_size)) return 0;
|
if (ckd_add(&last, shdr->sh_offset, shdr->sh_size)) return 0;
|
||||||
if (last > (uintptr_t)elf + mapsize) return 0;
|
if (last > mapsize) return 0;
|
||||||
return (void *)addr;
|
return (char *)elf + shdr->sh_offset;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,16 +17,24 @@
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/elf/elf.h"
|
#include "libc/elf/elf.h"
|
||||||
#include "libc/stdckdint.h"
|
#include "libc/elf/struct/shdr.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns section header object at `elf.section[i]`.
|
||||||
|
*
|
||||||
|
* @param elf points to the start of the executable image
|
||||||
|
* @param mapsize is the number of bytes past `elf` we can access
|
||||||
|
* @param i is the section header index, starting at zero
|
||||||
|
* @return section header pointer, or null on error
|
||||||
|
*/
|
||||||
Elf64_Shdr *GetElfSectionHeaderAddress(const Elf64_Ehdr *elf, //
|
Elf64_Shdr *GetElfSectionHeaderAddress(const Elf64_Ehdr *elf, //
|
||||||
size_t mapsize, //
|
size_t mapsize, //
|
||||||
Elf64_Half i) { //
|
Elf64_Half i) { //
|
||||||
uint64_t addr, last;
|
uint64_t off;
|
||||||
if (i >= elf->e_shnum) return 0;
|
if (i >= elf->e_shnum) return 0;
|
||||||
if (ckd_add(&addr, (uintptr_t)elf, elf->e_shoff)) return 0;
|
if (elf->e_shoff <= 0) return 0;
|
||||||
if (ckd_add(&addr, addr, (unsigned)i * elf->e_shentsize)) return 0;
|
if (elf->e_shoff >= mapsize) return 0;
|
||||||
if (ckd_add(&last, addr, elf->e_shentsize)) return 0;
|
if (elf->e_shentsize < sizeof(Elf64_Shdr)) return 0;
|
||||||
if (last > (uintptr_t)elf + mapsize) return 0;
|
if ((off = elf->e_shoff + (unsigned)i * elf->e_shentsize) > mapsize) return 0;
|
||||||
return (Elf64_Shdr *)addr;
|
return (Elf64_Shdr *)((char *)elf + off);
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,9 +17,16 @@
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/elf/elf.h"
|
#include "libc/elf/elf.h"
|
||||||
|
#include "libc/elf/struct/shdr.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns section name string table.
|
||||||
|
*
|
||||||
|
* @param elf points to the start of the executable image
|
||||||
|
* @param mapsize is the number of bytes past `elf` we can access
|
||||||
|
* @return double-nul terminated string list, or null on error
|
||||||
|
*/
|
||||||
char *GetElfSectionNameStringTable(const Elf64_Ehdr *elf, size_t mapsize) {
|
char *GetElfSectionNameStringTable(const Elf64_Ehdr *elf, size_t mapsize) {
|
||||||
if (!elf->e_shoff || !elf->e_shentsize) return 0;
|
|
||||||
return GetElfSectionAddress(
|
return GetElfSectionAddress(
|
||||||
elf, mapsize, GetElfSectionHeaderAddress(elf, mapsize, elf->e_shstrndx));
|
elf, mapsize, GetElfSectionHeaderAddress(elf, mapsize, elf->e_shstrndx));
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,17 +17,28 @@
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/elf/elf.h"
|
#include "libc/elf/elf.h"
|
||||||
#include "libc/stdckdint.h"
|
#include "libc/elf/scalar.h"
|
||||||
|
#include "libc/elf/struct/ehdr.h"
|
||||||
#include "libc/str/str.h"
|
#include "libc/str/str.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns `strtab + i` from elf string table.
|
||||||
|
*
|
||||||
|
* @param elf points to the start of the executable image
|
||||||
|
* @param mapsize is the number of bytes past `elf` we can access
|
||||||
|
* @param strtab is double-nul string list from GetElfStringTable()
|
||||||
|
* @param i is byte index into strtab where needed string starts
|
||||||
|
* @return pointer to nul terminated string, or null on error
|
||||||
|
*/
|
||||||
char *GetElfString(const Elf64_Ehdr *elf, // validated
|
char *GetElfString(const Elf64_Ehdr *elf, // validated
|
||||||
size_t mapsize, // validated
|
size_t mapsize, // validated
|
||||||
const char *strtab, // validated
|
const char *strtab, // validated
|
||||||
Elf64_Word rva) { // foreign
|
Elf64_Word i) { // foreign
|
||||||
uintptr_t addr;
|
const char *e;
|
||||||
if (!strtab) return 0;
|
e = (const char *)elf;
|
||||||
if (ckd_add(&addr, (uintptr_t)strtab, rva)) return 0;
|
if (strtab < e) return 0;
|
||||||
if (addr >= (uintptr_t)elf + mapsize) return 0;
|
if (strtab >= e + mapsize) return 0;
|
||||||
if (!memchr((char *)addr, 0, (uintptr_t)elf + mapsize - addr)) return 0;
|
if (strtab + i >= e + mapsize) return 0;
|
||||||
return (char *)addr;
|
if (!memchr(strtab + i, 0, (e + mapsize) - (strtab + i))) return 0;
|
||||||
|
return (char *)strtab + i;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,9 +18,21 @@
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/elf/def.h"
|
#include "libc/elf/def.h"
|
||||||
#include "libc/elf/elf.h"
|
#include "libc/elf/elf.h"
|
||||||
|
#include "libc/elf/struct/ehdr.h"
|
||||||
|
#include "libc/elf/struct/shdr.h"
|
||||||
#include "libc/str/str.h"
|
#include "libc/str/str.h"
|
||||||
|
|
||||||
char *GetElfStringTable(const Elf64_Ehdr *elf, size_t mapsize) {
|
/**
|
||||||
|
* Returns pointer to elf string table.
|
||||||
|
*
|
||||||
|
* @param elf points to the start of the executable image
|
||||||
|
* @param mapsize is the number of bytes past `elf` we can access
|
||||||
|
* @param section_name is usually `".strtab"`, `".dynstr"`, or null
|
||||||
|
* @return pointer to double-nul terminated string list or null on error
|
||||||
|
*/
|
||||||
|
char *GetElfStringTable(const Elf64_Ehdr *elf, //
|
||||||
|
size_t mapsize, //
|
||||||
|
const char *section_name) {
|
||||||
int i;
|
int i;
|
||||||
char *name;
|
char *name;
|
||||||
Elf64_Shdr *shdr;
|
Elf64_Shdr *shdr;
|
||||||
|
@ -28,9 +40,9 @@ char *GetElfStringTable(const Elf64_Ehdr *elf, size_t mapsize) {
|
||||||
if ((shdr = GetElfSectionHeaderAddress(elf, mapsize, i)) &&
|
if ((shdr = GetElfSectionHeaderAddress(elf, mapsize, i)) &&
|
||||||
shdr->sh_type == SHT_STRTAB &&
|
shdr->sh_type == SHT_STRTAB &&
|
||||||
(name = GetElfSectionName(elf, mapsize, shdr)) &&
|
(name = GetElfSectionName(elf, mapsize, shdr)) &&
|
||||||
!strcmp(name, ".strtab")) {
|
(!section_name || !strcmp(name, section_name))) {
|
||||||
return GetElfSectionAddress(elf, mapsize, shdr);
|
return GetElfSectionAddress(elf, mapsize, shdr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,37 +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 │
|
|
||||||
│ │
|
|
||||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
|
||||||
│ any purpose with or without fee is hereby granted, provided that the │
|
|
||||||
│ above copyright notice and this permission notice appear in all copies. │
|
|
||||||
│ │
|
|
||||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
|
||||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
|
||||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
|
||||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
|
||||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
|
||||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
|
||||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
|
||||||
#include "libc/elf/def.h"
|
|
||||||
#include "libc/elf/elf.h"
|
|
||||||
#include "libc/str/str.h"
|
|
||||||
|
|
||||||
char *GetElfStrs(const Elf64_Ehdr *elf, size_t mapsize, size_t *out_size) {
|
|
||||||
int i;
|
|
||||||
char *name;
|
|
||||||
Elf64_Shdr *shdr;
|
|
||||||
for (i = 0; i < elf->e_shnum; ++i) {
|
|
||||||
if ((shdr = GetElfSectionHeaderAddress(elf, mapsize, i)) &&
|
|
||||||
shdr->sh_type == SHT_STRTAB &&
|
|
||||||
(name = GetElfSectionName(elf, mapsize, shdr)) &&
|
|
||||||
!strcmp(name, ".strtab")) {
|
|
||||||
if (out_size) *out_size = shdr->sh_size;
|
|
||||||
return GetElfSectionAddress(elf, mapsize, shdr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -18,20 +18,32 @@
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/elf/def.h"
|
#include "libc/elf/def.h"
|
||||||
#include "libc/elf/elf.h"
|
#include "libc/elf/elf.h"
|
||||||
|
#include "libc/elf/scalar.h"
|
||||||
|
#include "libc/elf/struct/ehdr.h"
|
||||||
|
#include "libc/elf/struct/sym.h"
|
||||||
|
|
||||||
Elf64_Sym *GetElfSymbolTable(const Elf64_Ehdr *elf, size_t mapsize,
|
/**
|
||||||
|
* Returns pointer to elf symbol table.
|
||||||
|
*
|
||||||
|
* @param elf points to the start of the executable image
|
||||||
|
* @param mapsize is the number of bytes past `elf` we can access
|
||||||
|
* @param section_type is usually `SHT_SYMTAB` or `SHT_DYNSYM`
|
||||||
|
* @param out_count optionally receives number of elements in res
|
||||||
|
* @return pointer to symbol array, or null on error
|
||||||
|
*/
|
||||||
|
Elf64_Sym *GetElfSymbolTable(const Elf64_Ehdr *elf, //
|
||||||
|
size_t mapsize, //
|
||||||
|
int section_type, //
|
||||||
Elf64_Xword *out_count) {
|
Elf64_Xword *out_count) {
|
||||||
int i;
|
int i;
|
||||||
Elf64_Shdr *shdr;
|
Elf64_Shdr *shdr;
|
||||||
if (elf->e_shentsize) {
|
|
||||||
for (i = elf->e_shnum; i > 0; --i) {
|
for (i = elf->e_shnum; i > 0; --i) {
|
||||||
shdr = GetElfSectionHeaderAddress(elf, mapsize, i - 1);
|
if ((shdr = GetElfSectionHeaderAddress(elf, mapsize, i - 1)) && //
|
||||||
if (shdr->sh_type == SHT_SYMTAB) {
|
shdr->sh_entsize == sizeof(Elf64_Sym) && //
|
||||||
if (shdr->sh_entsize != sizeof(Elf64_Sym)) __builtin_trap();
|
shdr->sh_type == section_type) {
|
||||||
if (out_count) *out_count = shdr->sh_size / sizeof(Elf64_Sym);
|
if (out_count) *out_count = shdr->sh_size / sizeof(Elf64_Sym);
|
||||||
return GetElfSectionAddress(elf, mapsize, shdr);
|
return GetElfSectionAddress(elf, mapsize, shdr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
return 0;
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,39 +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 │
|
|
||||||
│ │
|
|
||||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
|
||||||
│ any purpose with or without fee is hereby granted, provided that the │
|
|
||||||
│ above copyright notice and this permission notice appear in all copies. │
|
|
||||||
│ │
|
|
||||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
|
||||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
|
||||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
|
||||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
|
||||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
|
||||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
|
||||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
|
||||||
#include "libc/elf/elf.h"
|
|
||||||
#include "libc/limits.h"
|
|
||||||
|
|
||||||
void GetElfVirtualAddressRange(const Elf64_Ehdr *elf, size_t elfsize,
|
|
||||||
intptr_t *out_start, intptr_t *out_end) {
|
|
||||||
unsigned i;
|
|
||||||
Elf64_Phdr *phdr;
|
|
||||||
intptr_t start, end, pstart, pend;
|
|
||||||
start = INTPTR_MAX;
|
|
||||||
end = 0;
|
|
||||||
for (i = 0; i < elf->e_phnum; ++i) {
|
|
||||||
phdr = GetElfSegmentHeaderAddress(elf, elfsize, i);
|
|
||||||
if (phdr->p_type != PT_LOAD) continue;
|
|
||||||
pstart = phdr->p_vaddr;
|
|
||||||
pend = phdr->p_vaddr + phdr->p_memsz;
|
|
||||||
if (pstart < start) start = pstart;
|
|
||||||
if (pend > end) end = pend;
|
|
||||||
}
|
|
||||||
if (out_start) *out_start = start;
|
|
||||||
if (out_end) *out_end = end;
|
|
||||||
}
|
|
|
@ -16,12 +16,20 @@
|
||||||
│ 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/elf/def.h"
|
||||||
#include "libc/elf/elf.h"
|
#include "libc/elf/elf.h"
|
||||||
#include "libc/str/str.h"
|
#include "libc/elf/struct/ehdr.h"
|
||||||
|
#include "libc/intrin/bits.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if `elf` is a 64-bit elf executable.
|
||||||
|
*
|
||||||
|
* @param elf points to the start of the executable image
|
||||||
|
* @param mapsize is the number of bytes past `elf` we can access
|
||||||
|
* @return true if elf header looks legit
|
||||||
|
*/
|
||||||
bool IsElf64Binary(const Elf64_Ehdr *elf, size_t mapsize) {
|
bool IsElf64Binary(const Elf64_Ehdr *elf, size_t mapsize) {
|
||||||
if (mapsize < sizeof(Elf64_Ehdr)) return false;
|
if (mapsize < sizeof(Elf64_Ehdr)) return false;
|
||||||
if (memcmp(elf->e_ident, ELFMAG, 4)) return false;
|
if (READ32LE(elf->e_ident) != READ32LE(ELFMAG)) return false;
|
||||||
return (elf->e_ident[EI_CLASS] == ELFCLASSNONE ||
|
return elf->e_ident[EI_CLASS] != ELFCLASS32;
|
||||||
elf->e_ident[EI_CLASS] == ELFCLASS64);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ELF_SCALAR_H_
|
#ifndef COSMOPOLITAN_LIBC_ELF_SCALAR_H_
|
||||||
#define COSMOPOLITAN_LIBC_ELF_SCALAR_H_
|
#define COSMOPOLITAN_LIBC_ELF_SCALAR_H_
|
||||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
||||||
|
|
||||||
#define Elf64_Addr uint64_t
|
#define Elf64_Addr uint64_t
|
||||||
#define Elf64_Half uint16_t
|
#define Elf64_Half uint16_t
|
||||||
|
@ -13,5 +12,4 @@
|
||||||
#define Elf64_Xword uint64_t
|
#define Elf64_Xword uint64_t
|
||||||
#define Elf_Symndx uint32_t
|
#define Elf_Symndx uint32_t
|
||||||
|
|
||||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
||||||
#endif /* COSMOPOLITAN_LIBC_ELF_SCALAR_H_ */
|
#endif /* COSMOPOLITAN_LIBC_ELF_SCALAR_H_ */
|
||||||
|
|
|
@ -22,14 +22,17 @@ int vsprintf(char *, const char *, va_list)
|
||||||
dontthrow nocallback;
|
dontthrow nocallback;
|
||||||
int sscanf(const char *, const char *, ...) scanfesque(2);
|
int sscanf(const char *, const char *, ...) scanfesque(2);
|
||||||
int vsscanf(const char *, const char *, va_list);
|
int vsscanf(const char *, const char *, va_list);
|
||||||
int vcscanf(int (*)(void *), int (*)(int, void *), void *, const char *,
|
|
||||||
va_list);
|
|
||||||
int __fmt(void *, void *, const char *, va_list) _Hide;
|
|
||||||
char *itoa(int, char *, int) compatfn;
|
char *itoa(int, char *, int) compatfn;
|
||||||
char *fcvt(double, int, int *, int *);
|
char *fcvt(double, int, int *, int *);
|
||||||
char *ecvt(double, int, int *, int *);
|
char *ecvt(double, int, int *, int *);
|
||||||
char *gcvt(double, int, char *);
|
char *gcvt(double, int, char *);
|
||||||
|
|
||||||
|
#ifdef COSMO
|
||||||
|
int __vcscanf(int (*)(void *), int (*)(int, void *), void *, const char *,
|
||||||
|
va_list);
|
||||||
|
int __fmt(void *, void *, const char *, va_list) _Hide;
|
||||||
|
#endif
|
||||||
|
|
||||||
COSMOPOLITAN_C_END_
|
COSMOPOLITAN_C_END_
|
||||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||||
#endif /* COSMOPOLITAN_LIBC_FMT_FMT_H_ */
|
#endif /* COSMOPOLITAN_LIBC_FMT_FMT_H_ */
|
||||||
|
|
|
@ -34,11 +34,10 @@ LIBC_FMT_A_CHECKS = \
|
||||||
$(LIBC_FMT_A_HDRS:%=o/$(MODE)/%.ok)
|
$(LIBC_FMT_A_HDRS:%=o/$(MODE)/%.ok)
|
||||||
|
|
||||||
LIBC_FMT_A_DIRECTDEPS = \
|
LIBC_FMT_A_DIRECTDEPS = \
|
||||||
|
LIBC_INTRIN \
|
||||||
LIBC_NEXGEN32E \
|
LIBC_NEXGEN32E \
|
||||||
LIBC_NT_KERNEL32 \
|
LIBC_NT_KERNEL32 \
|
||||||
LIBC_STR \
|
LIBC_STR \
|
||||||
LIBC_INTRIN \
|
|
||||||
LIBC_STUBS \
|
|
||||||
LIBC_SYSV \
|
LIBC_SYSV \
|
||||||
LIBC_TINYMATH \
|
LIBC_TINYMATH \
|
||||||
THIRD_PARTY_COMPILER_RT
|
THIRD_PARTY_COMPILER_RT
|
||||||
|
|
|
@ -17,11 +17,12 @@
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/intrin/kprintf.h"
|
#include "libc/intrin/kprintf.h"
|
||||||
|
#include "libc/runtime/runtime.h"
|
||||||
|
|
||||||
void __cxa_pure_virtual(void) {
|
void __cxa_pure_virtual(void) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
kprintf("__cxa_pure_virtual() called\n"
|
kprintf("__cxa_pure_virtual() called\n"
|
||||||
"Did you call a virtual method from a destructor?\n");
|
"Did you call a virtual method from a destructor?\n");
|
||||||
#endif
|
#endif
|
||||||
__builtin_trap();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
|
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||||
│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│
|
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
│ Copyright 2023 Justine Alexandra Roberts Tunney │
|
||||||
│ │
|
│ │
|
||||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||||
│ any purpose with or without fee is hereby granted, provided that the │
|
│ any purpose with or without fee is hereby granted, provided that the │
|
||||||
|
@ -16,9 +16,8 @@
|
||||||
│ 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/macros.internal.h"
|
|
||||||
|
|
||||||
// See -mfunction-return=thunk
|
// stub version of abort() for low-dependency apps
|
||||||
__x86_return_thunk:
|
__attribute__((__noreturn__, __weak__)) void abort(void) {
|
||||||
ret
|
__builtin_trap();
|
||||||
.endfn __x86_return_thunk,weak
|
}
|
|
@ -176,7 +176,7 @@ static bool __asan_once(void) {
|
||||||
#define __asan_unreachable() \
|
#define __asan_unreachable() \
|
||||||
do { \
|
do { \
|
||||||
kprintf("%s:%d: __asan_unreachable()\n", __FILE__, __LINE__); \
|
kprintf("%s:%d: __asan_unreachable()\n", __FILE__, __LINE__); \
|
||||||
for (;;) __builtin_trap(); \
|
__builtin_trap(); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
static int __asan_bsf(uint64_t x) {
|
static int __asan_bsf(uint64_t x) {
|
||||||
|
|
|
@ -15,8 +15,6 @@
|
||||||
|
|
||||||
#include "third_party/compiler_rt/int_lib.h"
|
#include "third_party/compiler_rt/int_lib.h"
|
||||||
|
|
||||||
#ifdef CRT_HAS_128BIT
|
|
||||||
|
|
||||||
/* Returns: a << b */
|
/* Returns: a << b */
|
||||||
|
|
||||||
/* Precondition: 0 <= b < bits_in_tword */
|
/* Precondition: 0 <= b < bits_in_tword */
|
||||||
|
@ -42,5 +40,3 @@ __ashlti3(ti_int a, si_int b)
|
||||||
}
|
}
|
||||||
return result.all;
|
return result.all;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CRT_HAS_128BIT */
|
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "libc/atomic.h"
|
#include "libc/atomic.h"
|
||||||
#include "libc/intrin/atomic.h"
|
#include "libc/intrin/atomic.h"
|
||||||
#include "libc/intrin/kprintf.h"
|
#include "libc/intrin/kprintf.h"
|
||||||
|
#include "libc/runtime/runtime.h"
|
||||||
|
|
||||||
privileged void __assert_fail(const char *expr, const char *file, int line) {
|
privileged void __assert_fail(const char *expr, const char *file, int line) {
|
||||||
static atomic_bool once;
|
static atomic_bool once;
|
||||||
|
|
|
@ -29,13 +29,13 @@ COMPILER_RT_ABI ti_int __divmodti4(ti_int a, ti_int b, tu_int *opt_out_rem) {
|
||||||
}
|
}
|
||||||
sa = a >> k; // sa = a < 0 ? -1 : 0
|
sa = a >> k; // sa = a < 0 ? -1 : 0
|
||||||
sb = b >> k; // sb = b < 0 ? -1 : 0
|
sb = b >> k; // sb = b < 0 ? -1 : 0
|
||||||
x = (a ^ sa) - sa; // negate if sa == -1
|
x = (tu_int)(a ^ sa) - sa; // negate if sa == -1
|
||||||
y = (b ^ sb) - sb; // negate if sb == -1
|
y = (tu_int)(b ^ sb) - sb; // negate if sb == -1
|
||||||
sq = sa ^ sb; // sign of quotient
|
sq = sa ^ sb; // sign of quotient
|
||||||
sr = sa; // sign of remainder
|
sr = sa; // sign of remainder
|
||||||
q = __udivmodti4(x, y, &r); // unsigned divide
|
q = __udivmodti4(x, y, &r); // unsigned divide
|
||||||
q = (q ^ sq) - sq; // fix quotient sign
|
q = (tu_int)(q ^ sq) - sq; // fix quotient sign
|
||||||
r = (r ^ sr) - sr; // fix remainder sign
|
r = (tu_int)(r ^ sr) - sr; // fix remainder sign
|
||||||
if (opt_out_rem) *opt_out_rem = r;
|
if (opt_out_rem) *opt_out_rem = r;
|
||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,12 +28,11 @@ LIBC_INTRIN_A_CHECKS = \
|
||||||
$(LIBC_INTRIN_A_HDRS:%=o/$(MODE)/%.ok)
|
$(LIBC_INTRIN_A_HDRS:%=o/$(MODE)/%.ok)
|
||||||
|
|
||||||
LIBC_INTRIN_A_DIRECTDEPS = \
|
LIBC_INTRIN_A_DIRECTDEPS = \
|
||||||
LIBC_STUBS \
|
|
||||||
LIBC_SYSV \
|
|
||||||
LIBC_SYSV_CALLS \
|
|
||||||
LIBC_NEXGEN32E \
|
LIBC_NEXGEN32E \
|
||||||
LIBC_NT_KERNEL32 \
|
LIBC_NT_KERNEL32 \
|
||||||
LIBC_NT_WS2_32
|
LIBC_NT_WS2_32 \
|
||||||
|
LIBC_SYSV \
|
||||||
|
LIBC_SYSV_CALLS
|
||||||
|
|
||||||
LIBC_INTRIN_A_DEPS := \
|
LIBC_INTRIN_A_DEPS := \
|
||||||
$(call uniq,$(foreach x,$(LIBC_INTRIN_A_DIRECTDEPS),$($(x))))
|
$(call uniq,$(foreach x,$(LIBC_INTRIN_A_DIRECTDEPS),$($(x))))
|
||||||
|
@ -218,8 +217,12 @@ o/$(MODE)/libc/intrin/aarch64/%.o: libc/intrin/aarch64/%.S
|
||||||
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||||
o/$(MODE)/libc/intrin/fenv.o: libc/intrin/fenv.S
|
o/$(MODE)/libc/intrin/fenv.o: libc/intrin/fenv.S
|
||||||
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||||
|
o/$(MODE)/libc/intrin/gcov.o: libc/intrin/gcov.S
|
||||||
|
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||||
o/$(MODE)/libc/intrin/futex.o: libc/intrin/futex.S
|
o/$(MODE)/libc/intrin/futex.o: libc/intrin/futex.S
|
||||||
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||||
|
o/$(MODE)/libc/intrin/typeinfo.o: libc/intrin/typeinfo.S
|
||||||
|
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||||
o/$(MODE)/libc/intrin/kclocknames.o: libc/intrin/kclocknames.S
|
o/$(MODE)/libc/intrin/kclocknames.o: libc/intrin/kclocknames.S
|
||||||
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||||
o/$(MODE)/libc/intrin/kdos2errno.o: libc/intrin/kdos2errno.S
|
o/$(MODE)/libc/intrin/kdos2errno.o: libc/intrin/kdos2errno.S
|
||||||
|
|
|
@ -26,7 +26,7 @@ __mulodi4(di_int a, di_int b, int* overflow)
|
||||||
const di_int MIN = (du_int)1 << (N-1);
|
const di_int MIN = (du_int)1 << (N-1);
|
||||||
const di_int MAX = ~MIN;
|
const di_int MAX = ~MIN;
|
||||||
*overflow = 0;
|
*overflow = 0;
|
||||||
di_int result = (du_int)a * (du_int)b;
|
di_int result = (du_int)a * b;
|
||||||
if (a == MIN)
|
if (a == MIN)
|
||||||
{
|
{
|
||||||
if (b != 0 && b != 1)
|
if (b != 0 && b != 1)
|
||||||
|
|
|
@ -26,7 +26,7 @@ __mulosi4(si_int a, si_int b, int* overflow)
|
||||||
const si_int MIN = (su_int)1 << (N-1);
|
const si_int MIN = (su_int)1 << (N-1);
|
||||||
const si_int MAX = ~MIN;
|
const si_int MAX = ~MIN;
|
||||||
*overflow = 0;
|
*overflow = 0;
|
||||||
si_int result = (su_int)a * (su_int)b;
|
si_int result = (su_int)a * b;
|
||||||
if (a == MIN)
|
if (a == MIN)
|
||||||
{
|
{
|
||||||
if (b != 0 && b != 1)
|
if (b != 0 && b != 1)
|
||||||
|
|
|
@ -28,7 +28,7 @@ __muloti4(ti_int a, ti_int b, int* overflow)
|
||||||
const ti_int MIN = (tu_int)1 << (N-1);
|
const ti_int MIN = (tu_int)1 << (N-1);
|
||||||
const ti_int MAX = ~MIN;
|
const ti_int MAX = ~MIN;
|
||||||
*overflow = 0;
|
*overflow = 0;
|
||||||
ti_int result = (tu_int)a * (tu_int)b;
|
ti_int result = (tu_int)a * b;
|
||||||
if (a == MIN)
|
if (a == MIN)
|
||||||
{
|
{
|
||||||
if (b != 0 && b != 1)
|
if (b != 0 && b != 1)
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/intrin/kprintf.h"
|
#include "libc/intrin/kprintf.h"
|
||||||
|
#include "libc/runtime/runtime.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Arithmetic overflow handler.
|
* Arithmetic overflow handler.
|
||||||
|
@ -31,5 +32,5 @@
|
||||||
*/
|
*/
|
||||||
__attribute__((__weak__)) void __on_arithmetic_overflow(void) {
|
__attribute__((__weak__)) void __on_arithmetic_overflow(void) {
|
||||||
kprintf("error: -ftrapv caught arithmetic overflow\n");
|
kprintf("error: -ftrapv caught arithmetic overflow\n");
|
||||||
__builtin_trap();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,8 +17,9 @@
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/intrin/kprintf.h"
|
#include "libc/intrin/kprintf.h"
|
||||||
|
#include "libc/runtime/runtime.h"
|
||||||
|
|
||||||
void __stack_chk_fail(void) {
|
__attribute__((__weak__)) void __stack_chk_fail(void) {
|
||||||
kprintf("stack smashed\n");
|
kprintf("%s: stack smashed\n", program_invocation_name);
|
||||||
__builtin_trap();
|
__builtin_trap();
|
||||||
}
|
}
|
|
@ -18,6 +18,6 @@
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/runtime/internal.h"
|
#include "libc/runtime/internal.h"
|
||||||
|
|
||||||
void __stack_chk_fail_local(void) {
|
__attribute__((__weak__)) void __stack_chk_fail_local(void) {
|
||||||
__stack_chk_fail();
|
__stack_chk_fail();
|
||||||
}
|
}
|
|
@ -199,7 +199,7 @@ static uintptr_t __ubsan_extend(struct UbsanTypeDescriptor *t, uintptr_t x) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static wontreturn void __ubsan_unreachable(void) {
|
static wontreturn void __ubsan_unreachable(void) {
|
||||||
for (;;) __builtin_trap();
|
for (;;) abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __ubsan_exit(void) {
|
static void __ubsan_exit(void) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef LIBC_ISYSTEM_ASSERT_H_
|
#ifndef _ASSERT_H
|
||||||
#define LIBC_ISYSTEM_ASSERT_H_
|
#define _ASSERT_H
|
||||||
#include "libc/assert.h"
|
#include "libc/assert.h"
|
||||||
#endif
|
#endif /* _ASSERT_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_BYTESWAP_H_
|
#ifndef _BYTESWAP_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_BYTESWAP_H_
|
#define _BYTESWAP_H
|
||||||
#include "libc/intrin/bswap.h"
|
#include "libc/intrin/bswap.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_BYTESWAP_H_ */
|
#endif /* _BYTESWAP_H */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#ifndef LIBC_ISYSTEM_COMPLEX_H_
|
#ifndef _COMPLEX_H
|
||||||
#define LIBC_ISYSTEM_COMPLEX_H_
|
#define _COMPLEX_H
|
||||||
#include "libc/complex.h"
|
#include "libc/complex.h"
|
||||||
#include "libc/imag.internal.h"
|
#include "libc/imag.internal.h"
|
||||||
#include "libc/math.h"
|
#include "libc/math.h"
|
||||||
#endif
|
#endif /* _COMPLEX_H */
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "libc/calls/struct/timespec.h"
|
#include "libc/calls/struct/timespec.h"
|
||||||
#include "libc/calls/struct/timeval.h"
|
#include "libc/calls/struct/timeval.h"
|
||||||
#include "libc/dce.h"
|
#include "libc/dce.h"
|
||||||
|
#include "libc/elf/elf.h"
|
||||||
#include "libc/fmt/itoa.h"
|
#include "libc/fmt/itoa.h"
|
||||||
#include "libc/fmt/leb128.h"
|
#include "libc/fmt/leb128.h"
|
||||||
#include "libc/intrin/bsf.h"
|
#include "libc/intrin/bsf.h"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_CPIO_H_
|
#ifndef _CPIO_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_CPIO_H_
|
#define _CPIO_H
|
||||||
#include "libc/sysv/consts/c.h"
|
#include "libc/sysv/consts/c.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_CPIO_H_ */
|
#endif /* _CPIO_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_CPUID_INTERNAL_H_
|
#ifndef _CPUID_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_CPUID_INTERNAL_H_
|
#define _CPUID_H
|
||||||
#include "third_party/intel/cpuid.internal.h"
|
#include "third_party/intel/cpuid.internal.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_CPUID_INTERNAL_H_ */
|
#endif /* _CPUID_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_CRYPT_H_
|
#ifndef _CRYPT_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_CRYPT_H_
|
#define _CRYPT_H
|
||||||
#include "third_party/musl/crypt.h"
|
#include "third_party/musl/crypt.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_CRYPT_H_ */
|
#endif /* _CRYPT_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef LIBC_ISYSTEM_CTYPE_H_
|
#ifndef _CTYPE_H
|
||||||
#define LIBC_ISYSTEM_CTYPE_H_
|
#define _CTYPE_H
|
||||||
#include "libc/str/str.h"
|
#include "libc/str/str.h"
|
||||||
#endif
|
#endif /* _CTYPE_H */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef LIBC_ISYSTEM_DIRENT_H_
|
#ifndef _DIRENT_H
|
||||||
#define LIBC_ISYSTEM_DIRENT_H_
|
#define _DIRENT_H
|
||||||
#include "libc/calls/calls.h"
|
#include "libc/calls/calls.h"
|
||||||
#include "libc/calls/struct/dirent.h"
|
#include "libc/calls/struct/dirent.h"
|
||||||
#include "libc/calls/weirdtypes.h"
|
#include "libc/calls/weirdtypes.h"
|
||||||
#include "libc/sysv/consts/dt.h"
|
#include "libc/sysv/consts/dt.h"
|
||||||
#endif
|
#endif /* _DIRENT_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef LIBC_ISYSTEM_SYS_DLFCN_H_
|
#ifndef _DLFCN_H
|
||||||
#define LIBC_ISYSTEM_SYS_DLFCN_H_
|
#define _DLFCN_H
|
||||||
#include "libc/runtime/dlfcn.h"
|
#include "libc/runtime/dlfcn.h"
|
||||||
#endif
|
#endif /* _DLFCN_H */
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_DOG_PY_
|
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_DOG_PY_
|
|
||||||
#include "third_party/intel/dog.py"
|
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_DOG_PY_ */
|
|
|
@ -1,4 +1,22 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_ELF_H_
|
#ifndef _ELF_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_ELF_H_
|
#define _ELF_H
|
||||||
#include "libc/elf/elf.h"
|
#include "libc/elf/def.h"
|
||||||
#endif
|
#include "libc/elf/scalar.h"
|
||||||
|
#include "libc/elf/struct/auxv.h"
|
||||||
|
#include "libc/elf/struct/chdr.h"
|
||||||
|
#include "libc/elf/struct/dyn.h"
|
||||||
|
#include "libc/elf/struct/ehdr.h"
|
||||||
|
#include "libc/elf/struct/lib.h"
|
||||||
|
#include "libc/elf/struct/move.h"
|
||||||
|
#include "libc/elf/struct/nhdr.h"
|
||||||
|
#include "libc/elf/struct/phdr.h"
|
||||||
|
#include "libc/elf/struct/rel.h"
|
||||||
|
#include "libc/elf/struct/rela.h"
|
||||||
|
#include "libc/elf/struct/shdr.h"
|
||||||
|
#include "libc/elf/struct/sym.h"
|
||||||
|
#include "libc/elf/struct/syminfo.h"
|
||||||
|
#include "libc/elf/struct/verdaux.h"
|
||||||
|
#include "libc/elf/struct/verdef.h"
|
||||||
|
#include "libc/elf/struct/vernaux.h"
|
||||||
|
#include "libc/elf/struct/verneed.h"
|
||||||
|
#endif /* _ELF_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef LIBC_ISYSTEM_ENDIAN_H_
|
#ifndef _ENDIAN_H
|
||||||
#define LIBC_ISYSTEM_ENDIAN_H_
|
#define _ENDIAN_H
|
||||||
#include "libc/intrin/newbie.h"
|
#include "libc/intrin/newbie.h"
|
||||||
#include "libc/sysv/consts/endian.h"
|
#include "libc/sysv/consts/endian.h"
|
||||||
#endif /* LIBC_ISYSTEM_ENDIAN_H_ */
|
#endif /* _ENDIAN_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef LIBC_ISYSTEM_ERR_H_
|
#ifndef _ERR_H
|
||||||
#define LIBC_ISYSTEM_ERR_H_
|
#define _ERR_H
|
||||||
#include "libc/log/bsd.h"
|
#include "libc/log/bsd.h"
|
||||||
#endif
|
#endif /* _ERR_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef LIBC_ISYSTEM_ERRNO_H_
|
#ifndef _ERRNO_H
|
||||||
#define LIBC_ISYSTEM_ERRNO_H_
|
#define _ERRNO_H
|
||||||
#include "libc/errno.h"
|
#include "libc/errno.h"
|
||||||
#endif
|
#endif /* _ERRNO_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef LIBC_ISYSTEM_SYS_FCNTL_H_
|
#ifndef _FCNTL_H
|
||||||
#define LIBC_ISYSTEM_SYS_FCNTL_H_
|
#define _FCNTL_H
|
||||||
#include "libc/calls/calls.h"
|
#include "libc/calls/calls.h"
|
||||||
#include "libc/calls/struct/flock.h"
|
#include "libc/calls/struct/flock.h"
|
||||||
#include "libc/calls/weirdtypes.h"
|
#include "libc/calls/weirdtypes.h"
|
||||||
|
@ -10,4 +10,4 @@
|
||||||
#include "libc/sysv/consts/posix.h"
|
#include "libc/sysv/consts/posix.h"
|
||||||
#include "libc/sysv/consts/s.h"
|
#include "libc/sysv/consts/s.h"
|
||||||
#include "libc/sysv/consts/splice.h"
|
#include "libc/sysv/consts/splice.h"
|
||||||
#endif
|
#endif /* _FCNTL_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_FEATURES_H_
|
#ifndef _FEATURES_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_FEATURES_H_
|
#define _FEATURES_H
|
||||||
|
|
||||||
#if defined(_ALL_SOURCE) && !defined(_GNU_SOURCE)
|
#if defined(_ALL_SOURCE) && !defined(_GNU_SOURCE)
|
||||||
#define _GNU_SOURCE 1
|
#define _GNU_SOURCE 1
|
||||||
|
@ -35,4 +35,4 @@
|
||||||
#define _Noreturn
|
#define _Noreturn
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_FEATURES_H_ */
|
#endif /* _FEATURES_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_FENV_H_
|
#ifndef _FENV_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_FENV_H_
|
#define _FENV_H
|
||||||
#include "libc/runtime/fenv.h"
|
#include "libc/runtime/fenv.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_FENV_H_ */
|
#endif /* _FENV_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef LIBC_ISYSTEM_FLOAT_H_
|
#ifndef _FLOAT_H
|
||||||
#define LIBC_ISYSTEM_FLOAT_H_
|
#define _FLOAT_H
|
||||||
#include "libc/math.h"
|
#include "libc/math.h"
|
||||||
#include "libc/runtime/fenv.h"
|
#include "libc/runtime/fenv.h"
|
||||||
#endif
|
#endif /* _FLOAT_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_FNMATCH_H_
|
#ifndef _FNMATCH_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_FNMATCH_H_
|
#define _FNMATCH_H
|
||||||
#include "third_party/musl/fnmatch.h"
|
#include "third_party/musl/fnmatch.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_FNMATCH_H_ */
|
#endif /* _FNMATCH_H */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_FTW_H_
|
#ifndef _FTW_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_FTW_H_
|
#define _FTW_H
|
||||||
#include "libc/calls/weirdtypes.h"
|
#include "libc/calls/weirdtypes.h"
|
||||||
#include "libc/sysv/consts/s.h"
|
#include "libc/sysv/consts/s.h"
|
||||||
#include "third_party/musl/ftw.h"
|
#include "third_party/musl/ftw.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_FTW_H_ */
|
#endif /* _FTW_H */
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_FUN_PY_
|
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_FUN_PY_
|
|
||||||
#include "third_party/intel/fun.py"
|
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_FUN_PY_ */
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef LIBC_ISYSTEM_GETOPT_H_
|
#ifndef _GETOPT_H
|
||||||
#define LIBC_ISYSTEM_GETOPT_H_
|
#define _GETOPT_H
|
||||||
#include "third_party/getopt/getopt.h"
|
#include "third_party/getopt/getopt.h"
|
||||||
#endif
|
#endif /* _GETOPT_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_GLOB_H_
|
#ifndef _GLOB_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_GLOB_H_
|
#define _GLOB_H
|
||||||
#include "third_party/musl/glob.h"
|
#include "third_party/musl/glob.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_GLOB_H_ */
|
#endif /* _GLOB_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef LIBC_ISYSTEM_GRP_H_
|
#ifndef _GRP_H
|
||||||
#define LIBC_ISYSTEM_GRP_H_
|
#define _GRP_H
|
||||||
#include "libc/calls/calls.h"
|
#include "libc/calls/calls.h"
|
||||||
#include "third_party/musl/passwd.h"
|
#include "third_party/musl/passwd.h"
|
||||||
#endif
|
#endif /* _GRP_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_ICONV_H_
|
#ifndef _ICONV_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_ICONV_H_
|
#define _ICONV_H
|
||||||
#include "libc/stdio/iconv.h"
|
#include "libc/stdio/iconv.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_ICONV_H_ */
|
#endif /* _ICONV_H */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef LIBC_ISYSTEM_INTTYPES_H_
|
#ifndef _INTTYPES_H
|
||||||
#define LIBC_ISYSTEM_INTTYPES_H_
|
#define _INTTYPES_H
|
||||||
#include "libc/fmt/conv.h"
|
#include "libc/fmt/conv.h"
|
||||||
#include "libc/inttypes.h"
|
#include "libc/inttypes.h"
|
||||||
#include "libc/limits.h"
|
#include "libc/limits.h"
|
||||||
#include "libc/literal.h"
|
#include "libc/literal.h"
|
||||||
#endif /* LIBC_ISYSTEM_INTTYPES_H_ */
|
#endif /* _INTTYPES_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_ISO646_H_
|
#ifndef _ISO646_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_ISO646_H_
|
#define _ISO646_H
|
||||||
#include "libc/iso646.internal.h"
|
#include "libc/iso646.internal.h"
|
||||||
#endif
|
#endif /* _ISO646_H */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_LANGINFO_H_
|
#ifndef _LANGINFO_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_LANGINFO_H_
|
#define _LANGINFO_H
|
||||||
#include "libc/str/langinfo.h"
|
#include "libc/str/langinfo.h"
|
||||||
#include "libc/str/locale.h"
|
#include "libc/str/locale.h"
|
||||||
#include "libc/str/nltypes.h"
|
#include "libc/str/nltypes.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_LANGINFO_H_ */
|
#endif /* _LANGINFO_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_LIBGEN_H_
|
#ifndef _LIBGEN_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_LIBGEN_H_
|
#define _LIBGEN_H
|
||||||
#include "libc/fmt/conv.h"
|
#include "libc/fmt/conv.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_LIBGEN_H_ */
|
#endif /* _LIBGEN_H */
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#ifndef LIBC_ISYSTEM_LIMITS_H_
|
#ifndef _LIMITS_H
|
||||||
#define LIBC_ISYSTEM_LIMITS_H_
|
#define _LIMITS_H
|
||||||
#include "libc/limits.h"
|
#include "libc/limits.h"
|
||||||
#include "libc/sysv/consts/_posix.h"
|
#include "libc/sysv/consts/_posix.h"
|
||||||
#include "libc/sysv/consts/iov.h"
|
#include "libc/sysv/consts/iov.h"
|
||||||
#include "libc/sysv/consts/limits.h"
|
#include "libc/sysv/consts/limits.h"
|
||||||
#include "libc/sysv/consts/xopen.h"
|
#include "libc/sysv/consts/xopen.h"
|
||||||
#include "libc/thread/thread.h"
|
#include "libc/thread/thread.h"
|
||||||
#endif
|
#endif /* _LIMITS_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_LOCALE_H_
|
#ifndef _LOCALE_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_LOCALE_H_
|
#define _LOCALE_H
|
||||||
#include "libc/str/locale.h"
|
#include "libc/str/locale.h"
|
||||||
#include "libc/str/unicode.h"
|
#include "libc/str/unicode.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_LOCALE_H_ */
|
#endif /* _LOCALE_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef LIBC_ISYSTEM_MALLOC_H_
|
#ifndef _MALLOC_H
|
||||||
#define LIBC_ISYSTEM_MALLOC_H_
|
#define _MALLOC_H
|
||||||
#include "libc/mem/mem.h"
|
#include "libc/mem/mem.h"
|
||||||
#endif
|
#endif /* _MALLOC_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef LIBC_ISYSTEM_MATH_H_
|
#ifndef _MATH_H
|
||||||
#define LIBC_ISYSTEM_MATH_H_
|
#define _MATH_H
|
||||||
#include "libc/math.h"
|
#include "libc/math.h"
|
||||||
#endif
|
#endif /* _MATH_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_MEMORY_H_
|
#ifndef _MEMORY_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_MEMORY_H_
|
#define _MEMORY_H
|
||||||
#include "libc/mem/alg.h"
|
#include "libc/mem/alg.h"
|
||||||
#include "libc/str/str.h"
|
#include "libc/str/str.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_MEMORY_H_ */
|
#endif /* _MEMORY_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_NETDB_H_
|
#ifndef _NETDB_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_NETDB_H_
|
#define _NETDB_H
|
||||||
#include "libc/dns/dns.h"
|
#include "libc/dns/dns.h"
|
||||||
#include "libc/dns/ent.h"
|
#include "libc/dns/ent.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_NETDB_H_ */
|
#endif /* _NETDB_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef LIBC_ISYSTEM_SETJMP_H_
|
#ifndef _SETJMP_H
|
||||||
#define LIBC_ISYSTEM_SETJMP_H_
|
#define _SETJMP_H
|
||||||
#include "libc/runtime/runtime.h"
|
#include "libc/runtime/runtime.h"
|
||||||
#endif
|
#endif /* _SETJMP_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef LIBC_ISYSTEM_SIGNAL_H_
|
#ifndef _SIGNAL_H
|
||||||
#define LIBC_ISYSTEM_SIGNAL_H_
|
#define _SIGNAL_H
|
||||||
#include "libc/calls/calls.h"
|
#include "libc/calls/calls.h"
|
||||||
#include "libc/calls/sigtimedwait.h"
|
#include "libc/calls/sigtimedwait.h"
|
||||||
#include "libc/calls/struct/sigaction.h"
|
#include "libc/calls/struct/sigaction.h"
|
||||||
|
@ -7,4 +7,4 @@
|
||||||
#include "libc/sysv/consts/sa.h"
|
#include "libc/sysv/consts/sa.h"
|
||||||
#include "libc/sysv/consts/sicode.h"
|
#include "libc/sysv/consts/sicode.h"
|
||||||
#include "libc/sysv/consts/ss.h"
|
#include "libc/sysv/consts/ss.h"
|
||||||
#endif
|
#endif /* _SIGNAL_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_STDALIGN_H_
|
#ifndef _STDALIGN_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_STDALIGN_H_
|
#define _STDALIGN_H
|
||||||
#include "libc/stdalign.internal.h"
|
#include "libc/stdalign.internal.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_STDALIGN_H_ */
|
#endif /* _STDALIGN_H */
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
#ifndef LIBC_ISYSTEM_STDARG_H_
|
#ifndef _STDARG_H
|
||||||
#define LIBC_ISYSTEM_STDARG_H_
|
#define _STDARG_H
|
||||||
#endif
|
#endif /* _STDARG_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_STDATOMIC_H_
|
#ifndef _STDATOMIC_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_STDATOMIC_H_
|
#define _STDATOMIC_H
|
||||||
#include "libc/intrin/atomic.h"
|
#include "libc/intrin/atomic.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_STDATOMIC_H_ */
|
#endif /* _STDATOMIC_H */
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
#ifndef LIBC_ISYSTEM_STDBOOL_H_
|
#ifndef _STDBOOL_H
|
||||||
#define LIBC_ISYSTEM_STDBOOL_H_
|
#define _STDBOOL_H
|
||||||
#endif
|
#endif /* _STDBOOL_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_STDCKDINT_H_
|
#ifndef _STDCKDINT_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_STDCKDINT_H_
|
#define _STDCKDINT_H
|
||||||
#include "libc/stdckdint.h"
|
#include "libc/stdckdint.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_STDCKDINT_H_ */
|
#endif /* _STDCKDINT_H */
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
#ifndef LIBC_ISYSTEM_STDDEF_H_
|
#ifndef _STDDEF_H
|
||||||
#define LIBC_ISYSTEM_STDDEF_H_
|
#define _STDDEF_H
|
||||||
#endif
|
#endif /* _STDDEF_H */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#ifndef LIBC_ISYSTEM_STDINT_H_
|
#ifndef _STDINT_H
|
||||||
#define LIBC_ISYSTEM_STDINT_H_
|
#define _STDINT_H
|
||||||
#include "libc/inttypes.h"
|
#include "libc/inttypes.h"
|
||||||
#include "libc/limits.h"
|
#include "libc/limits.h"
|
||||||
#include "libc/literal.h"
|
#include "libc/literal.h"
|
||||||
#endif
|
#endif /* _STDINT_H */
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
#ifndef LIBC_ISYSTEM_STDIO_H_
|
#ifndef _STDIO_H
|
||||||
#define LIBC_ISYSTEM_STDIO_H_
|
#define _STDIO_H
|
||||||
#include "libc/calls/calls.h"
|
#include "libc/calls/calls.h"
|
||||||
#include "libc/stdio/dprintf.h"
|
|
||||||
#include "libc/calls/weirdtypes.h"
|
#include "libc/calls/weirdtypes.h"
|
||||||
#include "libc/fmt/fmt.h"
|
#include "libc/fmt/fmt.h"
|
||||||
#include "libc/mem/fmt.h"
|
#include "libc/stdio/dprintf.h"
|
||||||
#include "libc/stdio/stdio.h"
|
#include "libc/stdio/stdio.h"
|
||||||
#include "libc/stdio/temp.h"
|
#include "libc/stdio/temp.h"
|
||||||
#include "third_party/musl/tempnam.h"
|
#include "third_party/musl/tempnam.h"
|
||||||
#endif
|
#endif /* _STDIO_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_STDIO_EXT_H_
|
#ifndef _STDIO_EXT_H
|
||||||
#define COSMOPOLITAN_LIBC_ISYSTEM_STDIO_EXT_H_
|
#define _STDIO_EXT_H
|
||||||
#include "libc/stdio/stdio_ext.h"
|
#include "libc/stdio/stdio_ext.h"
|
||||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_STDIO_EXT_H_ */
|
#endif /* _STDIO_EXT_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef LIBC_ISYSTEM_STDLIB_H_
|
#ifndef _STDLIB_H
|
||||||
#define LIBC_ISYSTEM_STDLIB_H_
|
#define _STDLIB_H
|
||||||
#include "libc/calls/calls.h"
|
#include "libc/calls/calls.h"
|
||||||
#include "libc/calls/termios.h"
|
#include "libc/calls/termios.h"
|
||||||
#include "libc/fmt/conv.h"
|
#include "libc/fmt/conv.h"
|
||||||
|
@ -15,4 +15,4 @@
|
||||||
#include "third_party/getopt/getopt.h"
|
#include "third_party/getopt/getopt.h"
|
||||||
#include "third_party/musl/crypt.h"
|
#include "third_party/musl/crypt.h"
|
||||||
#include "third_party/musl/rand48.h"
|
#include "third_party/musl/rand48.h"
|
||||||
#endif
|
#endif /* _STDLIB_H */
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue