parse line from /proc/ /maps format: 7fb60d1ea000-7fb60d20c000 r--p 00000000 103:02 120327460 /usr/lib/libc.so.6 only parts 0 and 2 are interesting, these are: 0. mapping address range 2. mapping offset from base
| 49 | // 0. mapping address range |
| 50 | // 2. mapping offset from base |
| 51 | inline mapping_entry_t parse_proc_maps_line(const std::string& line) { |
| 52 | std::string mapping_range_str, permissions_str, offset_from_base_str; |
| 53 | std::istringstream line_stream(line); |
| 54 | if(!std::getline(line_stream, mapping_range_str, ' ') || |
| 55 | !std::getline(line_stream, permissions_str, ' ') || |
| 56 | !std::getline(line_stream, offset_from_base_str, ' ')) { |
| 57 | return mapping_entry_t{}; |
| 58 | } |
| 59 | std::string mapping_start_str, mapping_end_str; |
| 60 | std::istringstream mapping_range_stream(mapping_range_str); |
| 61 | if(!std::getline(mapping_range_stream, mapping_start_str, '-') || |
| 62 | !std::getline(mapping_range_stream, mapping_end_str)) { |
| 63 | return mapping_entry_t{}; |
| 64 | } |
| 65 | mapping_entry_t mapping{}; |
| 66 | try { |
| 67 | mapping.start = hex_str_to_int(mapping_start_str); |
| 68 | mapping.end = hex_str_to_int(mapping_end_str); |
| 69 | mapping.offset_from_base = hex_str_to_int(offset_from_base_str); |
| 70 | return mapping; |
| 71 | } catch(std::invalid_argument& e) { |
| 72 | return mapping_entry_t{}; |
| 73 | } |
| 74 | } |
| 75 | |
| 76 | inline uintptr_t get_own_proc_addr_base(const void* addr) { |
| 77 | std::ifstream maps_file("/proc/self/maps"); |
no test coverage detected