10b57cec5SDimitry Andric //===-- sanitizer_getauxval.h -----------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // Common getauxval() guards and definitions. 100b57cec5SDimitry Andric // getauxval() is not defined until glibc version 2.16, or until API level 21 110b57cec5SDimitry Andric // for Android. 1268d75effSDimitry Andric // Implement the getauxval() compat function for NetBSD. 130b57cec5SDimitry Andric // 140b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric #ifndef SANITIZER_GETAUXVAL_H 170b57cec5SDimitry Andric #define SANITIZER_GETAUXVAL_H 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric #include "sanitizer_platform.h" 2068d75effSDimitry Andric #include "sanitizer_glibc_version.h" 210b57cec5SDimitry Andric 220b57cec5SDimitry Andric #if SANITIZER_LINUX || SANITIZER_FUCHSIA 230b57cec5SDimitry Andric 24*e8d8bef9SDimitry Andric # if (__GLIBC_PREREQ(2, 16) || (SANITIZER_ANDROID && __ANDROID_API__ >= 21) || \ 25*e8d8bef9SDimitry Andric SANITIZER_FUCHSIA) && \ 26*e8d8bef9SDimitry Andric !SANITIZER_GO 270b57cec5SDimitry Andric # define SANITIZER_USE_GETAUXVAL 1 280b57cec5SDimitry Andric # else 290b57cec5SDimitry Andric # define SANITIZER_USE_GETAUXVAL 0 300b57cec5SDimitry Andric # endif 310b57cec5SDimitry Andric 320b57cec5SDimitry Andric # if SANITIZER_USE_GETAUXVAL 330b57cec5SDimitry Andric # include <sys/auxv.h> 340b57cec5SDimitry Andric # else 350b57cec5SDimitry Andric // The weak getauxval definition allows to check for the function at runtime. 360b57cec5SDimitry Andric // This is useful for Android, when compiled at a lower API level yet running 370b57cec5SDimitry Andric // on a more recent platform that offers the function. 3868d75effSDimitry Andric extern "C" SANITIZER_WEAK_ATTRIBUTE unsigned long getauxval(unsigned long type); 390b57cec5SDimitry Andric # endif 400b57cec5SDimitry Andric 4168d75effSDimitry Andric #elif SANITIZER_NETBSD 4268d75effSDimitry Andric 4368d75effSDimitry Andric #define SANITIZER_USE_GETAUXVAL 1 4468d75effSDimitry Andric 4568d75effSDimitry Andric #include <dlfcn.h> 4668d75effSDimitry Andric #include <elf.h> 4768d75effSDimitry Andric getauxval(decltype (AuxInfo::a_type)type)4868d75effSDimitry Andricstatic inline decltype(AuxInfo::a_v) getauxval(decltype(AuxInfo::a_type) type) { 4968d75effSDimitry Andric for (const AuxInfo *aux = (const AuxInfo *)_dlauxinfo(); 5068d75effSDimitry Andric aux->a_type != AT_NULL; ++aux) { 5168d75effSDimitry Andric if (type == aux->a_type) 5268d75effSDimitry Andric return aux->a_v; 5368d75effSDimitry Andric } 5468d75effSDimitry Andric 5568d75effSDimitry Andric return 0; 5668d75effSDimitry Andric } 5768d75effSDimitry Andric 5868d75effSDimitry Andric #endif 590b57cec5SDimitry Andric 600b57cec5SDimitry Andric #endif // SANITIZER_GETAUXVAL_H 61