| OLD | NEW |
| 1 // Copyright (c) 2006, Google Inc. | 1 // Copyright (c) 2006, Google Inc. |
| 2 // All rights reserved. | 2 // All rights reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
| 9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
| 10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 // macro to add platform specific defines (e.g. OS_OPENBSD). | 49 // macro to add platform specific defines (e.g. OS_OPENBSD). |
| 50 | 50 |
| 51 #ifdef GLOG_BUILD_CONFIG_INCLUDE | 51 #ifdef GLOG_BUILD_CONFIG_INCLUDE |
| 52 #include GLOG_BUILD_CONFIG_INCLUDE | 52 #include GLOG_BUILD_CONFIG_INCLUDE |
| 53 #endif // GLOG_BUILD_CONFIG_INCLUDE | 53 #endif // GLOG_BUILD_CONFIG_INCLUDE |
| 54 | 54 |
| 55 #include "utilities.h" | 55 #include "utilities.h" |
| 56 | 56 |
| 57 #if defined(HAVE_SYMBOLIZE) | 57 #if defined(HAVE_SYMBOLIZE) |
| 58 | 58 |
| 59 #include <algorithm> |
| 59 #include <limits> | 60 #include <limits> |
| 60 | 61 |
| 61 #include "symbolize.h" | 62 #include "symbolize.h" |
| 62 #include "demangle.h" | 63 #include "demangle.h" |
| 63 | 64 |
| 64 _START_GOOGLE_NAMESPACE_ | 65 _START_GOOGLE_NAMESPACE_ |
| 65 | 66 |
| 66 // We don't use assert() since it's not guaranteed to be | 67 // We don't use assert() since it's not guaranteed to be |
| 67 // async-signal-safe. Instead we define a minimal assertion | 68 // async-signal-safe. Instead we define a minimal assertion |
| 68 // macro. So far, we don't need pretty printing for __FILE__, etc. | 69 // macro. So far, we don't need pretty printing for __FILE__, etc. |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 // 32 elements (to keep stack consumption low), otherwise we can | 290 // 32 elements (to keep stack consumption low), otherwise we can |
| 290 // have a 64 element Elf32_Sym array. | 291 // have a 64 element Elf32_Sym array. |
| 291 #if __WORDSIZE == 64 | 292 #if __WORDSIZE == 64 |
| 292 #define NUM_SYMBOLS 32 | 293 #define NUM_SYMBOLS 32 |
| 293 #else | 294 #else |
| 294 #define NUM_SYMBOLS 64 | 295 #define NUM_SYMBOLS 64 |
| 295 #endif | 296 #endif |
| 296 | 297 |
| 297 // Read at most NUM_SYMBOLS symbols at once to save read() calls. | 298 // Read at most NUM_SYMBOLS symbols at once to save read() calls. |
| 298 ElfW(Sym) buf[NUM_SYMBOLS]; | 299 ElfW(Sym) buf[NUM_SYMBOLS]; |
| 299 const ssize_t len = ReadFromOffset(fd, &buf, sizeof(buf), offset); | 300 int num_symbols_to_read = std::min(NUM_SYMBOLS, num_symbols - i); |
| 301 const ssize_t len = |
| 302 ReadFromOffset(fd, &buf, sizeof(buf[0]) * num_symbols_to_read, offset); |
| 300 SAFE_ASSERT(len % sizeof(buf[0]) == 0); | 303 SAFE_ASSERT(len % sizeof(buf[0]) == 0); |
| 301 const ssize_t num_symbols_in_buf = len / sizeof(buf[0]); | 304 const ssize_t num_symbols_in_buf = len / sizeof(buf[0]); |
| 302 SAFE_ASSERT(num_symbols_in_buf <= sizeof(buf)/sizeof(buf[0])); | 305 SAFE_ASSERT(num_symbols_in_buf <= num_symbols_to_read); |
| 303 for (int j = 0; j < num_symbols_in_buf; ++j) { | 306 for (int j = 0; j < num_symbols_in_buf; ++j) { |
| 304 const ElfW(Sym)& symbol = buf[j]; | 307 const ElfW(Sym)& symbol = buf[j]; |
| 305 uint64_t start_address = symbol.st_value; | 308 uint64_t start_address = symbol.st_value; |
| 306 start_address += symbol_offset; | 309 start_address += symbol_offset; |
| 307 uint64_t end_address = start_address + symbol.st_size; | 310 uint64_t end_address = start_address + symbol.st_size; |
| 308 if (symbol.st_value != 0 && // Skip null value symbols. | 311 if (symbol.st_value != 0 && // Skip null value symbols. |
| 309 symbol.st_shndx != 0 && // Skip undefined symbols. | 312 symbol.st_shndx != 0 && // Skip undefined symbols. |
| 310 start_address <= pc && pc < end_address) { | 313 start_address <= pc && pc < end_address) { |
| 311 ssize_t len1 = ReadFromOffset(fd, out, out_size, | 314 ssize_t len1 = ReadFromOffset(fd, out, out_size, |
| 312 strtab->sh_offset + symbol.st_name); | 315 strtab->sh_offset + symbol.st_name); |
| (...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 861 | 864 |
| 862 // TODO: Support other environments. | 865 // TODO: Support other environments. |
| 863 bool Symbolize(void *pc, char *out, int out_size) { | 866 bool Symbolize(void *pc, char *out, int out_size) { |
| 864 assert(0); | 867 assert(0); |
| 865 return false; | 868 return false; |
| 866 } | 869 } |
| 867 | 870 |
| 868 _END_GOOGLE_NAMESPACE_ | 871 _END_GOOGLE_NAMESPACE_ |
| 869 | 872 |
| 870 #endif | 873 #endif |
| OLD | NEW |