annotate libsanitizer/sanitizer_common/sanitizer_getauxval.h @ 158:494b0b89df80 default tip

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