1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CRAZY_LINKER_PROC_MAPS_H 6 #define CRAZY_LINKER_PROC_MAPS_H 7 8 // Helper classes and functions to extract useful information out of 9 // /proc/self/maps. 10 11 #include <stdint.h> 12 #include <sys/mman.h> // for PROT_READ etc... 13 14 namespace crazy { 15 16 class ProcMapsInternal; 17 18 class ProcMaps { 19 public: 20 // Used to open /proc/self/maps. 21 // There is no error reporting. If the file can't be opened, then 22 // GetNextEntry() will return false on the first call. 23 ProcMaps(); 24 25 // Used to open /proc/$PID/maps. 26 // There is also no error reporting. 27 explicit ProcMaps(pid_t pid); 28 29 ~ProcMaps(); 30 31 // Small structure to model an entry. 32 struct Entry { 33 size_t vma_start; 34 size_t vma_end; 35 int prot_flags; 36 size_t load_offset; 37 const char* path; // can be NULL, not always zero-terminated. 38 size_t path_len; // 0 if |path| is NULL. 39 }; 40 41 void Rewind(); 42 43 // Get next entry in maps, return NULL on failure. 44 // On success, return true and set |entry| to valid values. 45 // Note that the |entry->path| field can be NULL or will point to 46 // an address which content may change on the next call to this method. 47 bool GetNextEntry(Entry* entry); 48 49 int GetProtectionFlagsForAddress(void* address); 50 51 private: 52 ProcMapsInternal* internal_; 53 }; 54 55 // Find which loaded ELF binary contains |address|. 56 // On success, returns true and sets |*load_address| to its load address, 57 // and fills |path_buffer| with the path to the corresponding file. 58 bool FindElfBinaryForAddress(void* address, 59 uintptr_t* load_address, 60 char* path_buffer, 61 size_t path_buffer_len); 62 63 // Returns the current protection bit flags for the page holding a given 64 // |address|. On success, returns true and sets |*prot_flags|. 65 bool FindProtectionFlagsForAddress(void* address, int* prot_flags); 66 67 // Return the load address of a given ELF binary. 68 // If |file_name| contains a slash, this will try to perform an 69 // exact match with the content of /proc/self/maps. Otherwise, 70 // it will be taken as a base name, and the load address of the first 71 // matching entry will be returned. 72 // On success, returns true and sets |*load_address| to the load address, 73 // and |*load_offset| to the load offset. 74 bool FindLoadAddressForFile(const char* file_name, 75 uintptr_t* load_address, 76 uintptr_t* load_offset); 77 78 } // namespace crazy 79 80 #endif // CRAZY_LINKER_PROC_MAPS_H 81