llvm-project

Форк
0
/
asan_premap_shadow.cpp 
65 строк · 2.2 Кб
1
//===-- asan_premap_shadow.cpp --------------------------------------------===//
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
// This file is a part of AddressSanitizer, an address sanity checker.
10
//
11
// Reserve shadow memory with an ifunc resolver.
12
//===----------------------------------------------------------------------===//
13

14
#include "asan_mapping.h"
15

16
#if ASAN_PREMAP_SHADOW
17

18
#include "asan_premap_shadow.h"
19
#include "sanitizer_common/sanitizer_posix.h"
20

21
namespace __asan {
22

23
// The code in this file needs to run in an unrelocated binary. It may not
24
// access any external symbol, including its own non-hidden globals.
25

26
// Conservative upper limit.
27
uptr PremapShadowSize() {
28
  uptr granularity = GetMmapGranularity();
29
  return RoundUpTo(GetMaxVirtualAddress() >> ASAN_SHADOW_SCALE, granularity);
30
}
31

32
// Returns an address aligned to 8 pages, such that one page on the left and
33
// PremapShadowSize() bytes on the right of it are mapped r/o.
34
uptr PremapShadow() {
35
  return MapDynamicShadow(PremapShadowSize(), /*mmap_alignment_scale*/ 3,
36
                          /*min_shadow_base_alignment*/ 0, kHighMemEnd,
37
                          GetMmapGranularity());
38
}
39

40
bool PremapShadowFailed() {
41
  uptr shadow = reinterpret_cast<uptr>(&__asan_shadow);
42
  uptr resolver = reinterpret_cast<uptr>(&__asan_premap_shadow);
43
  // shadow == resolver is how Android KitKat and older handles ifunc.
44
  // shadow == 0 just in case.
45
  if (shadow == 0 || shadow == resolver)
46
    return true;
47
  return false;
48
}
49
} // namespace __asan
50

51
extern "C" {
52
decltype(__asan_shadow)* __asan_premap_shadow() {
53
  // The resolver may be called multiple times. Map the shadow just once.
54
  static uptr premapped_shadow = 0;
55
  if (!premapped_shadow) premapped_shadow = __asan::PremapShadow();
56
  return reinterpret_cast<decltype(__asan_shadow)*>(premapped_shadow);
57
}
58

59
// __asan_shadow is a "function" that has the same address as the first byte of
60
// the shadow mapping.
61
INTERFACE_ATTRIBUTE __attribute__((ifunc("__asan_premap_shadow"))) void
62
__asan_shadow();
63
}
64

65
#endif // ASAN_PREMAP_SHADOW
66

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.