| //===-- asan_process.h ------------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file is a part of AddressSanitizer, an address sanity checker. |
| // |
| // Information about the process mappings. |
| //===----------------------------------------------------------------------===// |
| #ifndef ASAN_PROCMAPS_H |
| #define ASAN_PROCMAPS_H |
| |
| #include "asan_internal.h" |
| |
| namespace __asan { |
| |
| class AsanProcMaps { |
| public: |
| AsanProcMaps(); |
| bool Next(uintptr_t *start, uintptr_t *end, uintptr_t *offset, |
| char filename[], size_t filename_size); |
| void Reset(); |
| // Gets the object file name and the offset in that object for a given |
| // address 'addr'. Returns true on success. |
| bool GetObjectNameAndOffset(uintptr_t addr, uintptr_t *offset, |
| char filename[], size_t filename_size); |
| ~AsanProcMaps(); |
| private: |
| // Default implementation of GetObjectNameAndOffset. |
| // Quite slow, because it iterates through the whole process map for each |
| // lookup. |
| bool IterateForObjectNameAndOffset(uintptr_t addr, uintptr_t *offset, |
| char filename[], size_t filename_size) { |
| Reset(); |
| uintptr_t start, end, file_offset; |
| for (int i = 0; Next(&start, &end, &file_offset, filename, filename_size); |
| i++) { |
| if (addr >= start && addr < end) { |
| // Don't subtract 'start' for the first entry. Don't ask me why. |
| *offset = (addr - (i ? start : 0)) + file_offset; |
| return true; |
| } |
| } |
| if (filename_size) |
| filename[0] = '\0'; |
| return false; |
| } |
| |
| #if defined __linux__ |
| char *proc_self_maps_buff_; |
| size_t proc_self_maps_buff_mmaped_size_; |
| size_t proc_self_maps_buff_len_; |
| char *current_; |
| #elif defined __APPLE__ |
| template<uint32_t kLCSegment, typename SegmentCommand> |
| bool NextSegmentLoad(uintptr_t *start, uintptr_t *end, uintptr_t *offset, |
| char filename[], size_t filename_size); |
| int current_image_; |
| uint32_t current_magic_; |
| int current_load_cmd_count_; |
| char *current_load_cmd_addr_; |
| #endif |
| }; |
| |
| } // namespace __asan |
| |
| #endif // ASAN_PROCMAPS_H |