1 //===-- sanitizer_getauxval.h -----------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Common getauxval() guards and definitions. 10 // getauxval() is not defined until glibc version 2.16, or until API level 21 11 // for Android. 12 // Implement the getauxval() compat function for NetBSD. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #ifndef SANITIZER_GETAUXVAL_H 17 #define SANITIZER_GETAUXVAL_H 18 19 #include "sanitizer_platform.h" 20 #include "sanitizer_glibc_version.h" 21 22 #if SANITIZER_LINUX || SANITIZER_FUCHSIA 23 24 # if __GLIBC_PREREQ(2, 16) || (SANITIZER_ANDROID && __ANDROID_API__ >= 21) || \ 25 SANITIZER_FUCHSIA 26 # define SANITIZER_USE_GETAUXVAL 1 27 # else 28 # define SANITIZER_USE_GETAUXVAL 0 29 # endif 30 31 # if SANITIZER_USE_GETAUXVAL 32 # include <sys/auxv.h> 33 # else 34 // The weak getauxval definition allows to check for the function at runtime. 35 // This is useful for Android, when compiled at a lower API level yet running 36 // on a more recent platform that offers the function. 37 extern "C" SANITIZER_WEAK_ATTRIBUTE unsigned long getauxval(unsigned long type); 38 # endif 39 40 #elif SANITIZER_NETBSD 41 42 #define SANITIZER_USE_GETAUXVAL 1 43 44 #include <dlfcn.h> 45 #include <elf.h> 46 47 static inline decltype(AuxInfo::a_v) getauxval(decltype(AuxInfo::a_type) type) { 48 for (const AuxInfo *aux = (const AuxInfo *)_dlauxinfo(); 49 aux->a_type != AT_NULL; ++aux) { 50 if (type == aux->a_type) 51 return aux->a_v; 52 } 53 54 return 0; 55 } 56 57 #endif 58 59 #endif // SANITIZER_GETAUXVAL_H 60