13cab2bb3Spatrick //===-- sanitizer_getauxval.h -----------------------------------*- C++ -*-===// 23cab2bb3Spatrick // 33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information. 53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63cab2bb3Spatrick // 73cab2bb3Spatrick //===----------------------------------------------------------------------===// 83cab2bb3Spatrick // 93cab2bb3Spatrick // Common getauxval() guards and definitions. 103cab2bb3Spatrick // getauxval() is not defined until glibc version 2.16, or until API level 21 113cab2bb3Spatrick // for Android. 123cab2bb3Spatrick // Implement the getauxval() compat function for NetBSD. 133cab2bb3Spatrick // 143cab2bb3Spatrick //===----------------------------------------------------------------------===// 153cab2bb3Spatrick 163cab2bb3Spatrick #ifndef SANITIZER_GETAUXVAL_H 173cab2bb3Spatrick #define SANITIZER_GETAUXVAL_H 183cab2bb3Spatrick 193cab2bb3Spatrick #include "sanitizer_platform.h" 203cab2bb3Spatrick #include "sanitizer_glibc_version.h" 213cab2bb3Spatrick 223cab2bb3Spatrick #if SANITIZER_LINUX || SANITIZER_FUCHSIA 233cab2bb3Spatrick 24*d89ec533Spatrick # if (__GLIBC_PREREQ(2, 16) || (SANITIZER_ANDROID && __ANDROID_API__ >= 21) || \ 25*d89ec533Spatrick SANITIZER_FUCHSIA) && \ 26*d89ec533Spatrick !SANITIZER_GO 273cab2bb3Spatrick # define SANITIZER_USE_GETAUXVAL 1 283cab2bb3Spatrick # else 293cab2bb3Spatrick # define SANITIZER_USE_GETAUXVAL 0 303cab2bb3Spatrick # endif 313cab2bb3Spatrick 323cab2bb3Spatrick # if SANITIZER_USE_GETAUXVAL 333cab2bb3Spatrick # include <sys/auxv.h> 343cab2bb3Spatrick # else 353cab2bb3Spatrick // The weak getauxval definition allows to check for the function at runtime. 363cab2bb3Spatrick // This is useful for Android, when compiled at a lower API level yet running 373cab2bb3Spatrick // on a more recent platform that offers the function. 383cab2bb3Spatrick extern "C" SANITIZER_WEAK_ATTRIBUTE unsigned long getauxval(unsigned long type); 393cab2bb3Spatrick # endif 403cab2bb3Spatrick 413cab2bb3Spatrick #elif SANITIZER_NETBSD 423cab2bb3Spatrick 433cab2bb3Spatrick #define SANITIZER_USE_GETAUXVAL 1 443cab2bb3Spatrick 453cab2bb3Spatrick #include <dlfcn.h> 463cab2bb3Spatrick #include <elf.h> 473cab2bb3Spatrick getauxval(decltype (AuxInfo::a_type)type)483cab2bb3Spatrickstatic inline decltype(AuxInfo::a_v) getauxval(decltype(AuxInfo::a_type) type) { 493cab2bb3Spatrick for (const AuxInfo *aux = (const AuxInfo *)_dlauxinfo(); 503cab2bb3Spatrick aux->a_type != AT_NULL; ++aux) { 513cab2bb3Spatrick if (type == aux->a_type) 523cab2bb3Spatrick return aux->a_v; 533cab2bb3Spatrick } 543cab2bb3Spatrick 553cab2bb3Spatrick return 0; 563cab2bb3Spatrick } 573cab2bb3Spatrick 583cab2bb3Spatrick #endif 593cab2bb3Spatrick 603cab2bb3Spatrick #endif // SANITIZER_GETAUXVAL_H 61