//===-- hwasan_globals.h ----------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file is a part of HWAddressSanitizer. // // Private Hwasan header. //===----------------------------------------------------------------------===// #ifndef HWASAN_GLOBALS_H #define HWASAN_GLOBALS_H #include #include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_internal_defs.h" namespace __hwasan { // This object should only ever be casted over the global (i.e. not constructed) // in the ELF PT_NOTE in order for `addr()` to work correctly. struct hwasan_global { // The size of this global variable. Note that the size in the descriptor is // max 1 << 24. Larger globals have multiple descriptors. uptr size() const { return info & 0xffffff; } // The fully-relocated address of this global. uptr addr() const { return reinterpret_cast(this) + gv_relptr; } // The static tag of this global. u8 tag() const { return info >> 24; }; // The relative address between the start of the descriptor for the HWASan // global (in the PT_NOTE), and the fully relocated address of the global. s32 gv_relptr; u32 info; }; // Walk through the specific DSO (as specified by the base, phdr, and phnum), // and return the range of the [beginning, end) of the HWASan globals descriptor // array. ArrayRef HwasanGlobalsFor(ElfW(Addr) base, const ElfW(Phdr) * phdr, ElfW(Half) phnum); } // namespace __hwasan #endif // HWASAN_GLOBALS_H