1 //===-- sanitizer_procmaps.h ------------------------------------*- C++ -*-===//
3 // This file is distributed under the University of Illinois Open Source
4 // License. See LICENSE.TXT for details.
6 //===----------------------------------------------------------------------===//
8 // This file is shared between AddressSanitizer and ThreadSanitizer.
10 // Information about the process mappings.
11 //===----------------------------------------------------------------------===//
12 #ifndef SANITIZER_PROCMAPS_H
13 #define SANITIZER_PROCMAPS_H
15 #include "sanitizer_internal_defs.h"
16 #include "sanitizer_mutex.h"
18 namespace __sanitizer
{
21 class MemoryMappingLayout
{
23 MemoryMappingLayout() {}
24 bool GetObjectNameAndOffset(uptr addr
, uptr
*offset
,
25 char filename
[], uptr filename_size
) {
31 #if defined(__linux__)
32 struct ProcSelfMapsBuff
{
37 #endif // defined(__linux__)
39 class MemoryMappingLayout
{
41 MemoryMappingLayout();
42 bool Next(uptr
*start
, uptr
*end
, uptr
*offset
,
43 char filename
[], uptr filename_size
);
45 // Gets the object file name and the offset in that object for a given
46 // address 'addr'. Returns true on success.
47 bool GetObjectNameAndOffset(uptr addr
, uptr
*offset
,
48 char filename
[], uptr filename_size
);
49 // In some cases, e.g. when running under a sandbox on Linux, ASan is unable
50 // to obtain the memory mappings. It should fall back to pre-cached data
51 // instead of aborting.
52 static void CacheMemoryMappings();
53 ~MemoryMappingLayout();
57 // Default implementation of GetObjectNameAndOffset.
58 // Quite slow, because it iterates through the whole process map for each
60 bool IterateForObjectNameAndOffset(uptr addr
, uptr
*offset
,
61 char filename
[], uptr filename_size
) {
63 uptr start
, end
, file_offset
;
64 for (int i
= 0; Next(&start
, &end
, &file_offset
, filename
, filename_size
);
66 if (addr
>= start
&& addr
< end
) {
67 // Don't subtract 'start' for the first entry:
68 // * If a binary is compiled w/o -pie, then the first entry in
69 // process maps is likely the binary itself (all dynamic libs
70 // are mapped higher in address space). For such a binary,
71 // instruction offset in binary coincides with the actual
72 // instruction address in virtual memory (as code section
73 // is mapped to a fixed memory range).
74 // * If a binary is compiled with -pie, all the modules are
75 // mapped high at address space (in particular, higher than
76 // shadow memory of the tool), so the module can't be the
78 *offset
= (addr
- (i
? start
: 0)) + file_offset
;
87 # if defined __linux__
88 ProcSelfMapsBuff proc_self_maps_
;
91 // Static mappings cache.
92 static ProcSelfMapsBuff cached_proc_self_maps_
;
93 static StaticSpinMutex cache_lock_
; // protects cached_proc_self_maps_.
94 # elif defined __APPLE__
95 template<u32 kLCSegment
, typename SegmentCommand
>
96 bool NextSegmentLoad(uptr
*start
, uptr
*end
, uptr
*offset
,
97 char filename
[], uptr filename_size
);
100 u32 current_filetype_
;
101 int current_load_cmd_count_
;
102 char *current_load_cmd_addr_
;
108 } // namespace __sanitizer
110 #endif // SANITIZER_PROCMAPS_H