blob: cd6dca9777d5e1bdac27e6e3a3a165f28d8c2562 [file] [log] [blame]
Josh Gao93c0f5e2015-10-06 11:08:13 -07001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in
12 * the documentation and/or other materials provided with the
13 * distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
Elliott Hughesfc69a8a2016-03-04 11:53:09 -080028
Josh Gao93c0f5e2015-10-06 11:08:13 -070029#ifndef _PRIVATE_BIONIC_GLOBALS_H
30#define _PRIVATE_BIONIC_GLOBALS_H
31
Florian Mayer408e1702022-05-12 13:06:04 -070032#include <inttypes.h>
33#include <link.h>
34#include <platform/bionic/malloc.h>
35#include <pthread.h>
Christopher Ferris62e1e2c2019-02-04 12:26:02 -080036#include <stdatomic.h>
Josh Gao93c0f5e2015-10-06 11:08:13 -070037#include <sys/cdefs.h>
Elliott Hughesfc69a8a2016-03-04 11:53:09 -080038
Florian Mayer408e1702022-05-12 13:06:04 -070039#include "private/WriteProtected.h"
Ryan Prichard16455b52019-01-18 01:00:59 -080040#include "private/bionic_allocator.h"
Ryan Prichard45d13492019-01-03 02:51:30 -080041#include "private/bionic_elf_tls.h"
Josh Gaof6e5b582018-06-01 15:30:54 -070042#include "private/bionic_fdsan.h"
Josh Gao3c8fc2f2015-10-08 14:49:26 -070043#include "private/bionic_malloc_dispatch.h"
Josh Gao93c0f5e2015-10-06 11:08:13 -070044#include "private/bionic_vdso.h"
Evgenii Stepanov8564b8d2020-12-15 13:55:32 -080045
Josh Gao93c0f5e2015-10-06 11:08:13 -070046struct libc_globals {
47 vdso_entry vdso[VDSO_END];
Josh Gaofe9d0ed2015-10-07 14:32:36 -070048 long setjmp_cookie;
Mitch Phillips3b21ada2020-01-07 15:47:47 -080049 uintptr_t heap_pointer_tag;
Christopher Ferrisb4e560e2023-10-26 17:00:00 -070050 _Atomic(bool) decay_time_enabled;
Florian Mayere65e1932024-02-15 22:20:54 +000051 _Atomic(bool) memtag;
Christopher Ferris62e1e2c2019-02-04 12:26:02 -080052
53 // In order to allow a complete switch between dispatch tables without
54 // the need for copying each function by function in the structure,
55 // use a single atomic pointer to switch.
56 // The current_dispatch_table pointer can only ever be set to a complete
57 // table. Any dispatch table that is pointed to by current_dispatch_table
58 // cannot be modified after that. If the pointer changes in the future,
59 // the old pointer must always stay valid.
60 // The malloc_dispatch_table is modified by malloc debug, malloc hooks,
61 // and heaprofd. Only one of these modes can be active at any given time.
62 _Atomic(const MallocDispatch*) current_dispatch_table;
Christopher Ferris1fc5ccf2019-02-15 18:06:15 -080063 // This pointer is only used by the allocation limit code when both a
64 // limit is enabled and some other hook is enabled at the same time.
65 _Atomic(const MallocDispatch*) default_dispatch_table;
Christopher Ferris62e1e2c2019-02-04 12:26:02 -080066 MallocDispatch malloc_dispatch_table;
Josh Gao93c0f5e2015-10-06 11:08:13 -070067};
68
Mitch Phillips7c1f3772023-09-28 13:45:59 +020069struct memtag_dynamic_entries_t {
70 void* memtag_globals;
71 size_t memtag_globalssz;
72 bool has_memtag_mode;
73 unsigned memtag_mode;
74 bool memtag_heap;
75 bool memtag_stack;
76};
77
Josh Gao93c0f5e2015-10-06 11:08:13 -070078__LIBC_HIDDEN__ extern WriteProtected<libc_globals> __libc_globals;
Florian Mayerc0aa70a2024-06-24 15:49:20 -070079// These cannot be in __libc_globals, because we cannot access the
Florian Mayer73750dc2024-03-08 14:10:48 -080080// WriteProtected in a thread-safe way.
81// See b/328256432.
Florian Mayerc0aa70a2024-06-24 15:49:20 -070082//
83// __libc_memtag_stack says whether stack MTE is enabled on the process, i.e.
84// whether the stack pages are mapped with PROT_MTE. This is always false if
85// MTE is disabled for the process (i.e. libc_globals.memtag is false).
Florian Mayer73750dc2024-03-08 14:10:48 -080086__LIBC_HIDDEN__ extern _Atomic(bool) __libc_memtag_stack;
Florian Mayerc0aa70a2024-06-24 15:49:20 -070087// __libc_memtag_stack_abi says whether the process contains any code that was
88// compiled with memtag-stack. This is true even if the process does not have
89// MTE enabled (e.g. because it was overridden using MEMTAG_OPTIONS, or because
90// MTE is disabled for the device).
91// Code compiled with memtag-stack needs a stack history buffer in
92// TLS_SLOT_STACK_MTE, because the codegen will emit an unconditional
93// (to keep the code branchless) write to it.
94// Protected by g_heap_creation_lock.
95__LIBC_HIDDEN__ extern bool __libc_memtag_stack_abi;
Josh Gao93c0f5e2015-10-06 11:08:13 -070096
Ryan Prichard7752bcb2018-11-22 02:41:04 -080097struct abort_msg_t;
Florian Mayer7c83d092024-02-07 16:25:18 -080098struct crash_detail_page_t;
Mitch Phillips4c9293f2020-02-14 14:50:35 -080099namespace gwp_asan {
100struct AllocatorState;
101struct AllocationMetadata;
102}; // namespace gwp_asan
Ryan Prichard7752bcb2018-11-22 02:41:04 -0800103
Josh Gaof6e5b582018-06-01 15:30:54 -0700104// Globals shared between the dynamic linker and libc.so.
105struct libc_shared_globals {
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -0800106 // Construct the shared globals using a constexpr constructor to ensure that
107 // the object doesn't need dynamic initialization. The object is accessed
108 // before the dynamic linker has relocated itself.
109 constexpr libc_shared_globals() {}
110
Josh Gaoe6dab7b2018-08-06 18:47:29 -0700111 FdTable fd_table;
Ryan Prichard8f639a42018-10-01 23:10:05 -0700112
113 // When the linker is invoked on a binary (e.g. `linker64 /system/bin/date`),
114 // record the number of arguments passed to the linker itself rather than to
115 // the program it's loading. Typically 0, sometimes 1.
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -0800116 int initial_linker_arg_count = 0;
Ryan Prichard7752bcb2018-11-22 02:41:04 -0800117
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -0800118 ElfW(auxv_t)* auxv = nullptr;
Ryan Prichard5a664902018-11-22 02:14:14 -0800119
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -0800120 pthread_mutex_t abort_msg_lock = PTHREAD_MUTEX_INITIALIZER;
121 abort_msg_t* abort_msg = nullptr;
Ryan Prichard48b11592018-11-22 02:41:36 -0800122
Ryan Prichard45d13492019-01-03 02:51:30 -0800123 StaticTlsLayout static_tls_layout;
Ryan Pricharde5e69e02019-01-01 18:53:48 -0800124 TlsModules tls_modules;
Ryan Prichard16455b52019-01-18 01:00:59 -0800125 BionicAllocator tls_allocator;
Ryan Prichard45d13492019-01-03 02:51:30 -0800126
Peter Collingbourne2659d7b2021-03-05 13:31:41 -0800127 // Values passed from libc.so to the loader.
Peter Collingbourne65332082019-08-05 16:16:14 -0700128 void (*load_hook)(ElfW(Addr) base, const ElfW(Phdr)* phdr, ElfW(Half) phnum) = nullptr;
129 void (*unload_hook)(ElfW(Addr) base, const ElfW(Phdr)* phdr, ElfW(Half) phnum) = nullptr;
Peter Collingbourne2659d7b2021-03-05 13:31:41 -0800130 void (*set_target_sdk_version_hook)(int target) = nullptr;
Peter Collingbourne65332082019-08-05 16:16:14 -0700131
Ryan Prichard48b11592018-11-22 02:41:36 -0800132 // Values passed from the linker to libc.so.
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -0800133 const char* init_progname = nullptr;
134 char** init_environ = nullptr;
Mitch Phillips4c9293f2020-02-14 14:50:35 -0800135
Mitch Phillipsba1e9212020-04-28 11:33:48 -0700136 const gwp_asan::AllocatorState* gwp_asan_state = nullptr;
137 const gwp_asan::AllocationMetadata* gwp_asan_metadata = nullptr;
Mitch Phillipsa493fe42023-01-19 12:47:22 -0800138 bool (*debuggerd_needs_gwp_asan_recovery)(void* fault_addr) = nullptr;
139 void (*debuggerd_gwp_asan_pre_crash_report)(void* fault_addr) = nullptr;
140 void (*debuggerd_gwp_asan_post_crash_report)(void* fault_addr) = nullptr;
Peter Collingbourned3060012020-04-01 19:54:48 -0700141
142 const char* scudo_stack_depot = nullptr;
143 const char* scudo_region_info = nullptr;
Peter Collingbourne2753fc82021-01-06 21:02:19 -0800144 const char* scudo_ring_buffer = nullptr;
Florian Mayer347dc622022-12-22 16:13:09 -0800145 size_t scudo_ring_buffer_size = 0;
Florian Mayeraf067592023-12-04 16:38:26 -0800146 size_t scudo_stack_depot_size = 0;
Evgenii Stepanov8564b8d2020-12-15 13:55:32 -0800147
148 HeapTaggingLevel initial_heap_tagging_level = M_HEAP_TAGGING_LEVEL_NONE;
Florian Mayerc0aa70a2024-06-24 15:49:20 -0700149 // See comments for __libc_memtag_stack / __libc_memtag_stack_abi above.
Evgenii Stepanovf9fa32a2022-05-12 15:54:38 -0700150 bool initial_memtag_stack = false;
Florian Mayerc0aa70a2024-06-24 15:49:20 -0700151 bool initial_memtag_stack_abi = false;
Florian Mayer408e1702022-05-12 13:06:04 -0700152 int64_t heap_tagging_upgrade_timer_sec = 0;
Florian Mayera453c2d2024-02-09 00:40:45 +0000153
Florian Mayere65e1932024-02-15 22:20:54 +0000154 void (*memtag_stack_dlopen_callback)() = nullptr;
Florian Mayer7c83d092024-02-07 16:25:18 -0800155 pthread_mutex_t crash_detail_page_lock = PTHREAD_MUTEX_INITIALIZER;
156 crash_detail_page_t* crash_detail_page = nullptr;
Josh Gaof6e5b582018-06-01 15:30:54 -0700157};
158
Ryan Prichardabf736a2018-11-22 02:40:17 -0800159__LIBC_HIDDEN__ libc_shared_globals* __libc_shared_globals();
Florian Mayerc138f812024-10-29 15:26:13 -0700160__LIBC_HIDDEN__ bool __libc_mte_enabled();
Florian Mayera6e9dcf2024-11-06 12:41:22 -0800161__LIBC_HIDDEN__ void __libc_init_mte(const memtag_dynamic_entries_t*, const void*, size_t,
162 uintptr_t);
163__LIBC_HIDDEN__ void __libc_init_mte_stack(void*);
Josh Gaof6e5b582018-06-01 15:30:54 -0700164__LIBC_HIDDEN__ void __libc_init_fdsan();
Josh Gao97271922019-11-06 13:15:00 -0800165__LIBC_HIDDEN__ void __libc_init_fdtrack();
Ryan Savitski175c8862020-01-02 19:54:57 +0000166__LIBC_HIDDEN__ void __libc_init_profiling_handlers();
Josh Gaof6e5b582018-06-01 15:30:54 -0700167
Josh Gao3c8fc2f2015-10-08 14:49:26 -0700168__LIBC_HIDDEN__ void __libc_init_malloc(libc_globals* globals);
Ryan Prichard07440a82018-11-22 03:16:06 -0800169__LIBC_HIDDEN__ void __libc_init_setjmp_cookie(libc_globals* globals);
170__LIBC_HIDDEN__ void __libc_init_vdso(libc_globals* globals);
Elliott Hughesfc69a8a2016-03-04 11:53:09 -0800171
Mingwei Shibe910522015-11-12 07:02:14 +0000172#if defined(__i386__)
173__LIBC_HIDDEN__ extern void* __libc_sysinfo;
Pirama Arumuga Nainar7b89be72021-02-12 15:09:49 -0800174extern "C" __LIBC_HIDDEN__ void __libc_int0x80();
Ryan Prichard07440a82018-11-22 03:16:06 -0800175__LIBC_HIDDEN__ void __libc_init_sysinfo();
Mingwei Shibe910522015-11-12 07:02:14 +0000176#endif
177
Josh Gao93c0f5e2015-10-06 11:08:13 -0700178#endif