src/share/vm/utilities/elfSymbolTable.cpp

Print this page

        

*** 32,42 **** ElfSymbolTable::ElfSymbolTable(FILE* file, Elf_Shdr shdr) { assert(file, "null file handle"); m_symbols = NULL; m_next = NULL; m_file = file; ! m_status = Decoder::no_error; // try to load the string table long cur_offset = ftell(file); if (cur_offset != -1) { // call malloc so we can back up if memory allocation fails. --- 32,42 ---- ElfSymbolTable::ElfSymbolTable(FILE* file, Elf_Shdr shdr) { assert(file, "null file handle"); m_symbols = NULL; m_next = NULL; m_file = file; ! m_status = NullDecoder::no_error; // try to load the string table long cur_offset = ftell(file); if (cur_offset != -1) { // call malloc so we can back up if memory allocation fails.
*** 43,62 **** m_symbols = (Elf_Sym*)os::malloc(shdr.sh_size); if (m_symbols) { if (fseek(file, shdr.sh_offset, SEEK_SET) || fread((void*)m_symbols, shdr.sh_size, 1, file) != 1 || fseek(file, cur_offset, SEEK_SET)) { ! m_status = Decoder::file_invalid; os::free(m_symbols); m_symbols = NULL; } } ! if (m_status == Decoder::no_error) { memcpy(&m_shdr, &shdr, sizeof(Elf_Shdr)); } } else { ! m_status = Decoder::file_invalid; } } ElfSymbolTable::~ElfSymbolTable() { if (m_symbols != NULL) { --- 43,62 ---- m_symbols = (Elf_Sym*)os::malloc(shdr.sh_size); if (m_symbols) { if (fseek(file, shdr.sh_offset, SEEK_SET) || fread((void*)m_symbols, shdr.sh_size, 1, file) != 1 || fseek(file, cur_offset, SEEK_SET)) { ! m_status = NullDecoder::file_invalid; os::free(m_symbols); m_symbols = NULL; } } ! if (!NullDecoder::is_error(m_status)) { memcpy(&m_shdr, &shdr, sizeof(Elf_Shdr)); } } else { ! m_status = NullDecoder::file_invalid; } } ElfSymbolTable::~ElfSymbolTable() { if (m_symbols != NULL) {
*** 66,82 **** if (m_next != NULL) { delete m_next; } } ! Decoder::decoder_status ElfSymbolTable::lookup(address addr, int* stringtableIndex, int* posIndex, int* offset) { assert(stringtableIndex, "null string table index pointer"); assert(posIndex, "null string table offset pointer"); assert(offset, "null offset pointer"); ! if (m_status != Decoder::no_error) { ! return m_status; } address pc = 0; size_t sym_size = sizeof(Elf_Sym); assert((m_shdr.sh_size % sym_size) == 0, "check size"); --- 66,82 ---- if (m_next != NULL) { delete m_next; } } ! bool ElfSymbolTable::lookup(address addr, int* stringtableIndex, int* posIndex, int* offset) { assert(stringtableIndex, "null string table index pointer"); assert(posIndex, "null string table offset pointer"); assert(offset, "null offset pointer"); ! if (NullDecoder::is_error(m_status)) { ! return false; } address pc = 0; size_t sym_size = sizeof(Elf_Sym); assert((m_shdr.sh_size % sym_size) == 0, "check size");
*** 95,106 **** } } else { long cur_pos; if ((cur_pos = ftell(m_file)) == -1 || fseek(m_file, m_shdr.sh_offset, SEEK_SET)) { ! m_status = Decoder::file_invalid; ! return m_status; } Elf_Sym sym; for (int index = 0; index < count; index ++) { if (fread(&sym, sym_size, 1, m_file) == 1) { --- 95,106 ---- } } else { long cur_pos; if ((cur_pos = ftell(m_file)) == -1 || fseek(m_file, m_shdr.sh_offset, SEEK_SET)) { ! m_status = NullDecoder::file_invalid; ! return false; } Elf_Sym sym; for (int index = 0; index < count; index ++) { if (fread(&sym, sym_size, 1, m_file) == 1) {
*** 112,126 **** *posIndex = sym.st_name; *stringtableIndex = m_shdr.sh_link; } } } else { ! m_status = Decoder::file_invalid; ! return m_status; } } fseek(m_file, cur_pos, SEEK_SET); } ! return m_status; } #endif // _WINDOWS --- 112,126 ---- *posIndex = sym.st_name; *stringtableIndex = m_shdr.sh_link; } } } else { ! m_status = NullDecoder::file_invalid; ! return false; } } fseek(m_file, cur_pos, SEEK_SET); } ! return true; } #endif // _WINDOWS