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"
17 namespace __sanitizer
{
20 class MemoryMappingLayout
{
22 MemoryMappingLayout() {}
23 bool GetObjectNameAndOffset(uptr addr
, uptr
*offset
,
24 char filename
[], uptr filename_size
) {
31 class MemoryMappingLayout
{
33 MemoryMappingLayout();
34 bool Next(uptr
*start
, uptr
*end
, uptr
*offset
,
35 char filename
[], uptr filename_size
);
37 // Gets the object file name and the offset in that object for a given
38 // address 'addr'. Returns true on success.
39 bool GetObjectNameAndOffset(uptr addr
, uptr
*offset
,
40 char filename
[], uptr filename_size
);
41 ~MemoryMappingLayout();
44 // Default implementation of GetObjectNameAndOffset.
45 // Quite slow, because it iterates through the whole process map for each
47 bool IterateForObjectNameAndOffset(uptr addr
, uptr
*offset
,
48 char filename
[], uptr filename_size
) {
50 uptr start
, end
, file_offset
;
51 for (int i
= 0; Next(&start
, &end
, &file_offset
, filename
, filename_size
);
53 if (addr
>= start
&& addr
< end
) {
54 // Don't subtract 'start' for the first entry:
55 // * If a binary is compiled w/o -pie, then the first entry in
56 // process maps is likely the binary itself (all dynamic libs
57 // are mapped higher in address space). For such a binary,
58 // instruction offset in binary coincides with the actual
59 // instruction address in virtual memory (as code section
60 // is mapped to a fixed memory range).
61 // * If a binary is compiled with -pie, all the modules are
62 // mapped high at address space (in particular, higher than
63 // shadow memory of the tool), so the module can't be the
65 *offset
= (addr
- (i
? start
: 0)) + file_offset
;
74 # if defined __linux__
75 char *proc_self_maps_buff_
;
76 uptr proc_self_maps_buff_mmaped_size_
;
77 uptr proc_self_maps_buff_len_
;
79 # elif defined __APPLE__
80 template<u32 kLCSegment
, typename SegmentCommand
>
81 bool NextSegmentLoad(uptr
*start
, uptr
*end
, uptr
*offset
,
82 char filename
[], uptr filename_size
);
85 u32 current_filetype_
;
86 int current_load_cmd_count_
;
87 char *current_load_cmd_addr_
;
93 } // namespace __sanitizer
95 #endif // SANITIZER_PROCMAPS_H