blob: 5c9b726d21f224d58dcd6ab721e6ca1c565a89a1 [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
Christopher Ferris62e1e2c2019-02-04 12:26:02 -080032#include <stdatomic.h>
Josh Gao93c0f5e2015-10-06 11:08:13 -070033#include <sys/cdefs.h>
Ryan Prichard5a664902018-11-22 02:14:14 -080034#include <link.h>
Ryan Prichard7752bcb2018-11-22 02:41:04 -080035#include <pthread.h>
Elliott Hughesfc69a8a2016-03-04 11:53:09 -080036
Ryan Prichard16455b52019-01-18 01:00:59 -080037#include "private/bionic_allocator.h"
Ryan Prichard45d13492019-01-03 02:51:30 -080038#include "private/bionic_elf_tls.h"
Josh Gaof6e5b582018-06-01 15:30:54 -070039#include "private/bionic_fdsan.h"
Josh Gao3c8fc2f2015-10-08 14:49:26 -070040#include "private/bionic_malloc_dispatch.h"
Josh Gao93c0f5e2015-10-06 11:08:13 -070041#include "private/bionic_vdso.h"
42#include "private/WriteProtected.h"
43
44struct libc_globals {
45 vdso_entry vdso[VDSO_END];
Josh Gaofe9d0ed2015-10-07 14:32:36 -070046 long setjmp_cookie;
Mitch Phillips3b21ada2020-01-07 15:47:47 -080047 uintptr_t heap_pointer_tag;
Christopher Ferris62e1e2c2019-02-04 12:26:02 -080048
49 // In order to allow a complete switch between dispatch tables without
50 // the need for copying each function by function in the structure,
51 // use a single atomic pointer to switch.
52 // The current_dispatch_table pointer can only ever be set to a complete
53 // table. Any dispatch table that is pointed to by current_dispatch_table
54 // cannot be modified after that. If the pointer changes in the future,
55 // the old pointer must always stay valid.
56 // The malloc_dispatch_table is modified by malloc debug, malloc hooks,
57 // and heaprofd. Only one of these modes can be active at any given time.
58 _Atomic(const MallocDispatch*) current_dispatch_table;
Christopher Ferris1fc5ccf2019-02-15 18:06:15 -080059 // This pointer is only used by the allocation limit code when both a
60 // limit is enabled and some other hook is enabled at the same time.
61 _Atomic(const MallocDispatch*) default_dispatch_table;
Christopher Ferris62e1e2c2019-02-04 12:26:02 -080062 MallocDispatch malloc_dispatch_table;
Josh Gao93c0f5e2015-10-06 11:08:13 -070063};
64
65__LIBC_HIDDEN__ extern WriteProtected<libc_globals> __libc_globals;
66
Ryan Prichard7752bcb2018-11-22 02:41:04 -080067struct abort_msg_t;
Mitch Phillips4c9293f2020-02-14 14:50:35 -080068namespace gwp_asan {
69struct AllocatorState;
70struct AllocationMetadata;
71}; // namespace gwp_asan
Ryan Prichard7752bcb2018-11-22 02:41:04 -080072
Josh Gaof6e5b582018-06-01 15:30:54 -070073// Globals shared between the dynamic linker and libc.so.
74struct libc_shared_globals {
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -080075 // Construct the shared globals using a constexpr constructor to ensure that
76 // the object doesn't need dynamic initialization. The object is accessed
77 // before the dynamic linker has relocated itself.
78 constexpr libc_shared_globals() {}
79
Josh Gaoe6dab7b2018-08-06 18:47:29 -070080 FdTable fd_table;
Ryan Prichard8f639a42018-10-01 23:10:05 -070081
82 // When the linker is invoked on a binary (e.g. `linker64 /system/bin/date`),
83 // record the number of arguments passed to the linker itself rather than to
84 // the program it's loading. Typically 0, sometimes 1.
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -080085 int initial_linker_arg_count = 0;
Ryan Prichard7752bcb2018-11-22 02:41:04 -080086
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -080087 ElfW(auxv_t)* auxv = nullptr;
Ryan Prichard5a664902018-11-22 02:14:14 -080088
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -080089 pthread_mutex_t abort_msg_lock = PTHREAD_MUTEX_INITIALIZER;
90 abort_msg_t* abort_msg = nullptr;
Ryan Prichard48b11592018-11-22 02:41:36 -080091
Ryan Prichard45d13492019-01-03 02:51:30 -080092 StaticTlsLayout static_tls_layout;
Ryan Pricharde5e69e02019-01-01 18:53:48 -080093 TlsModules tls_modules;
Ryan Prichard16455b52019-01-18 01:00:59 -080094 BionicAllocator tls_allocator;
Ryan Prichard45d13492019-01-03 02:51:30 -080095
Peter Collingbourne65332082019-08-05 16:16:14 -070096 // Values passed from the HWASan runtime (via libc.so) to the loader.
97 void (*load_hook)(ElfW(Addr) base, const ElfW(Phdr)* phdr, ElfW(Half) phnum) = nullptr;
98 void (*unload_hook)(ElfW(Addr) base, const ElfW(Phdr)* phdr, ElfW(Half) phnum) = nullptr;
99
Ryan Prichard48b11592018-11-22 02:41:36 -0800100 // Values passed from the linker to libc.so.
Ryan Prichard0b0ee0c2018-12-14 17:34:05 -0800101 const char* init_progname = nullptr;
102 char** init_environ = nullptr;
Mitch Phillips4c9293f2020-02-14 14:50:35 -0800103
Mitch Phillipsba1e9212020-04-28 11:33:48 -0700104 const gwp_asan::AllocatorState* gwp_asan_state = nullptr;
105 const gwp_asan::AllocationMetadata* gwp_asan_metadata = nullptr;
Peter Collingbourned3060012020-04-01 19:54:48 -0700106
107 const char* scudo_stack_depot = nullptr;
108 const char* scudo_region_info = nullptr;
Josh Gaof6e5b582018-06-01 15:30:54 -0700109};
110
Ryan Prichardabf736a2018-11-22 02:40:17 -0800111__LIBC_HIDDEN__ libc_shared_globals* __libc_shared_globals();
Josh Gaof6e5b582018-06-01 15:30:54 -0700112__LIBC_HIDDEN__ void __libc_init_fdsan();
Josh Gao97271922019-11-06 13:15:00 -0800113__LIBC_HIDDEN__ void __libc_init_fdtrack();
Ryan Savitski175c8862020-01-02 19:54:57 +0000114__LIBC_HIDDEN__ void __libc_init_profiling_handlers();
Josh Gaof6e5b582018-06-01 15:30:54 -0700115
Josh Gao3c8fc2f2015-10-08 14:49:26 -0700116__LIBC_HIDDEN__ void __libc_init_malloc(libc_globals* globals);
Ryan Prichard07440a82018-11-22 03:16:06 -0800117__LIBC_HIDDEN__ void __libc_init_setjmp_cookie(libc_globals* globals);
118__LIBC_HIDDEN__ void __libc_init_vdso(libc_globals* globals);
Elliott Hughesfc69a8a2016-03-04 11:53:09 -0800119
Mingwei Shibe910522015-11-12 07:02:14 +0000120#if defined(__i386__)
121__LIBC_HIDDEN__ extern void* __libc_sysinfo;
Ryan Prichard1990ba52019-02-07 21:31:31 -0800122__LIBC_HIDDEN__ void __libc_int0x80();
Ryan Prichard07440a82018-11-22 03:16:06 -0800123__LIBC_HIDDEN__ void __libc_init_sysinfo();
Mingwei Shibe910522015-11-12 07:02:14 +0000124#endif
125
Josh Gao93c0f5e2015-10-06 11:08:13 -0700126#endif