1 #pragma once 2 3 #include <limits.h> 4 #include <stdatomic.h> 5 #include <stdbool.h> 6 #include <stdint.h> 7 #include <stdio.h> 8 #include <stdlib.h> 9 10 #include <zircon/compiler.h> 11 #include <zircon/types.h> 12 13 struct __locale_map; 14 15 struct __locale_struct { 16 const struct __locale_map* volatile cat[6]; 17 }; 18 19 struct tls_module { 20 struct tls_module* next; 21 void* image; 22 size_t len, size, align, offset; 23 }; 24 25 struct __libc { 26 atomic_int thread_count; 27 struct tls_module* tls_head; 28 size_t tls_size, tls_align, tls_cnt; 29 size_t stack_size; 30 size_t page_size; 31 struct __locale_struct global_locale; 32 }; 33 34 #ifdef __PIC__ 35 #define ATTR_LIBC_VISIBILITY __attribute__((visibility("hidden"))) 36 #else 37 #define ATTR_LIBC_VISIBILITY 38 #endif 39 40 // Put this on things that are touched only during dynamic linker startup. 41 #define ATTR_RELRO __SECTION(".data.rel.ro") 42 43 extern struct __libc __libc ATTR_LIBC_VISIBILITY; 44 #define libc __libc 45 46 extern size_t __hwcap ATTR_LIBC_VISIBILITY; 47 extern char *__progname, *__progname_full; 48 49 void __libc_start_init(void) ATTR_LIBC_VISIBILITY; 50 51 void __funcs_on_exit(void) ATTR_LIBC_VISIBILITY; 52 void __funcs_on_quick_exit(void) ATTR_LIBC_VISIBILITY; 53 void __libc_exit_fini(void) ATTR_LIBC_VISIBILITY; 54 55 void __dl_thread_cleanup(void) ATTR_LIBC_VISIBILITY; 56 57 void __tls_run_dtors(void) ATTR_LIBC_VISIBILITY; 58 59 // Registers the handles that zx_take_startup_handle() will return. 60 // 61 // This function takes ownership of the data, but not the memory: it assumes 62 // that the arrays are valid as long as the process is alive. 63 // 64 // |handles| and |handle_info| are parallel arrays and must have |nhandles| 65 // entries. 66 // |handles| contains the actual handle values, or ZX_HANDLE_INVALID if a 67 // handle has already been claimed. 68 // |handle_info| contains the PA_HND value associated with the 69 // corresponding element of |handles|, or zero if the handle has already 70 // been claimed. 71 void __libc_startup_handles_init(uint32_t nhandles, 72 zx_handle_t handles[], 73 uint32_t handle_info[]) ATTR_LIBC_VISIBILITY; 74 75 _Noreturn void __libc_start_main(void* arg, int (*main)(int, char**, char**)); 76 77 78 // Hook for extension libraries to init. Extensions must zero out 79 // handle[i] and handle_info[i] for any handles they claim. 80 void __libc_extensions_init(uint32_t handle_count, 81 zx_handle_t handle[], 82 uint32_t handle_info[], 83 uint32_t name_count, 84 char** names) __attribute__((weak)); 85 86 // Hook for extension libraries to clean up. This is run after exit 87 // and quick_exit handlers. 88 void __libc_extensions_fini(void) __attribute__((weak)); 89 90 extern uintptr_t __stack_chk_guard; 91 void __stack_chk_fail(void); 92 93 int __lockfile(FILE*) ATTR_LIBC_VISIBILITY; 94 void __unlockfile(FILE*) ATTR_LIBC_VISIBILITY; 95 96 // Hook for extension libraries to return the maximum number of files that 97 // a process can have open at any time. Used to answer sysconf(_SC_OPEN_MAX). 98 // Returns -1 if the value is unknown. 99 int _fd_open_max(void); 100 101 extern char** __environ; 102 103 #undef weak_alias 104 #define weak_alias(old, new) extern __typeof(old) new __attribute__((weak, alias(#old))) 105 106 #ifdef __clang__ 107 #define NO_ASAN __attribute__((no_sanitize("address"))) 108 #else 109 #define NO_ASAN 110 #endif 111