blob: c7e951d7fb9d6f10ca5f2de7284fe7a5fb58f7cb [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;
Evgenii Stepanovf9fa32a2022-05-12 15:54:38 -070050 _Atomic(bool) memtag_stack;
Christopher Ferris62e1e2c2019-02-04 12:26:02 -080051
52 // In order to allow a complete switch between dispatch tables without
53 // the need for copying each function by function in the structure,
54 // use a single atomic pointer to switch.
55 // The current_dispatch_table pointer can only ever be set to a complete
56 // table. Any dispatch table that is pointed to by current_dispatch_table
57 // cannot be modified after that. If the pointer changes in the future,
58 // the old pointer must always stay valid.
59 // The malloc_dispatch_table is modified by malloc debug, malloc hooks,
60 // and heaprofd. Only one of these modes can be active at any given time.
61 _Atomic(const MallocDispatch*) current_dispatch_table;
Christopher Ferris1fc5ccf2019-02-15 18:06:15 -080062 // This pointer is only used by the allocation limit code when both a
63 // limit is enabled and some other hook is enabled at the same time.
64 _Atomic(const MallocDispatch*) default_dispatch_table;
Christopher Ferris62e1e2c2019-02-04 12:26:02 -080065 MallocDispatch malloc_dispatch_table;
Josh Gao93c0f5e2015-10-06 11:08:13 -070066};
67
68__LIBC_HIDDEN__ extern WriteProtected<libc_globals> __libc_globals;
69
Ryan Prichard7752bcb2018-11-22 02:41:04 -080070struct abort_msg_t;
Mitch Phillips4c9293f2020-02-14 14:50:35 -080071namespace gwp_asan {
72struct AllocatorState;
73struct AllocationMetadata;
74}; // namespace gwp_asan
Ryan Prichard7752bcb2018-11-22 02:41:04 -080075
Josh Gaof6e5b582018-06-01 15:30:54 -070076// Globals shared between the dynamic linker and libc.so.
77struct libc_shared_globals {
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -080078 // Construct the shared globals using a constexpr constructor to ensure that
79 // the object doesn't need dynamic initialization. The object is accessed
80 // before the dynamic linker has relocated itself.
81 constexpr libc_shared_globals() {}
82
Josh Gaoe6dab7b2018-08-06 18:47:29 -070083 FdTable fd_table;
Ryan Prichard8f639a42018-10-01 23:10:05 -070084
85 // When the linker is invoked on a binary (e.g. `linker64 /system/bin/date`),
86 // record the number of arguments passed to the linker itself rather than to
87 // the program it's loading. Typically 0, sometimes 1.
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -080088 int initial_linker_arg_count = 0;
Ryan Prichard7752bcb2018-11-22 02:41:04 -080089
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -080090 ElfW(auxv_t)* auxv = nullptr;
Ryan Prichard5a664902018-11-22 02:14:14 -080091
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -080092 pthread_mutex_t abort_msg_lock = PTHREAD_MUTEX_INITIALIZER;
93 abort_msg_t* abort_msg = nullptr;
Ryan Prichard48b11592018-11-22 02:41:36 -080094
Ryan Prichard45d13492019-01-03 02:51:30 -080095 StaticTlsLayout static_tls_layout;
Ryan Pricharde5e69e02019-01-01 18:53:48 -080096 TlsModules tls_modules;
Ryan Prichard16455b52019-01-18 01:00:59 -080097 BionicAllocator tls_allocator;
Ryan Prichard45d13492019-01-03 02:51:30 -080098
Peter Collingbourne2659d7b2021-03-05 13:31:41 -080099 // Values passed from libc.so to the loader.
Peter Collingbourne65332082019-08-05 16:16:14 -0700100 void (*load_hook)(ElfW(Addr) base, const ElfW(Phdr)* phdr, ElfW(Half) phnum) = nullptr;
101 void (*unload_hook)(ElfW(Addr) base, const ElfW(Phdr)* phdr, ElfW(Half) phnum) = nullptr;
Peter Collingbourne2659d7b2021-03-05 13:31:41 -0800102 void (*set_target_sdk_version_hook)(int target) = nullptr;
Peter Collingbourne65332082019-08-05 16:16:14 -0700103
Ryan Prichard48b11592018-11-22 02:41:36 -0800104 // Values passed from the linker to libc.so.
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -0800105 const char* init_progname = nullptr;
106 char** init_environ = nullptr;
Mitch Phillips4c9293f2020-02-14 14:50:35 -0800107
Mitch Phillipsba1e9212020-04-28 11:33:48 -0700108 const gwp_asan::AllocatorState* gwp_asan_state = nullptr;
109 const gwp_asan::AllocationMetadata* gwp_asan_metadata = nullptr;
Peter Collingbourned3060012020-04-01 19:54:48 -0700110
111 const char* scudo_stack_depot = nullptr;
112 const char* scudo_region_info = nullptr;
Peter Collingbourne2753fc82021-01-06 21:02:19 -0800113 const char* scudo_ring_buffer = nullptr;
Evgenii Stepanov8564b8d2020-12-15 13:55:32 -0800114
115 HeapTaggingLevel initial_heap_tagging_level = M_HEAP_TAGGING_LEVEL_NONE;
Evgenii Stepanovf9fa32a2022-05-12 15:54:38 -0700116 bool initial_memtag_stack = false;
Florian Mayer408e1702022-05-12 13:06:04 -0700117 int64_t heap_tagging_upgrade_timer_sec = 0;
Josh Gaof6e5b582018-06-01 15:30:54 -0700118};
119
Ryan Prichardabf736a2018-11-22 02:40:17 -0800120__LIBC_HIDDEN__ libc_shared_globals* __libc_shared_globals();
Josh Gaof6e5b582018-06-01 15:30:54 -0700121__LIBC_HIDDEN__ void __libc_init_fdsan();
Josh Gao97271922019-11-06 13:15:00 -0800122__LIBC_HIDDEN__ void __libc_init_fdtrack();
Ryan Savitski175c8862020-01-02 19:54:57 +0000123__LIBC_HIDDEN__ void __libc_init_profiling_handlers();
Josh Gaof6e5b582018-06-01 15:30:54 -0700124
Josh Gao3c8fc2f2015-10-08 14:49:26 -0700125__LIBC_HIDDEN__ void __libc_init_malloc(libc_globals* globals);
Ryan Prichard07440a82018-11-22 03:16:06 -0800126__LIBC_HIDDEN__ void __libc_init_setjmp_cookie(libc_globals* globals);
127__LIBC_HIDDEN__ void __libc_init_vdso(libc_globals* globals);
Elliott Hughesfc69a8a2016-03-04 11:53:09 -0800128
Mingwei Shibe910522015-11-12 07:02:14 +0000129#if defined(__i386__)
130__LIBC_HIDDEN__ extern void* __libc_sysinfo;
Pirama Arumuga Nainar7b89be72021-02-12 15:09:49 -0800131extern "C" __LIBC_HIDDEN__ void __libc_int0x80();
Ryan Prichard07440a82018-11-22 03:16:06 -0800132__LIBC_HIDDEN__ void __libc_init_sysinfo();
Mingwei Shibe910522015-11-12 07:02:14 +0000133#endif
134
Josh Gao93c0f5e2015-10-06 11:08:13 -0700135#endif