bool JavaJncReader::_processInlineSections() { //if (nullptr == debugFP) { // debugFP = fopen("c:\\Temp\\java-debug.txt", "w"); //} // Process the stringtable if (nullptr == m_string_table_buf) { // JNC Files for Native methods won't have stringtable, bc2src and pc2bc sections.. return true; } if (!_process_stringtable_section()) { delete m_pExecutable; m_pExecutable = nullptr; return false; } // DumpStringTable(debugFP); // Process .bc2src if (nullptr == m_pBc2srcBuf) { delete m_pExecutable; m_pExecutable = nullptr; return false; } if (!_process_bc2src_section()) { delete m_pExecutable; m_pExecutable = nullptr; return false; } //DumpJncMethodMap(debugFP); //DumpAddressRangeTable(debugFP); // Process the pc2bc if (nullptr == m_pPc2bcBuf) { // OS_OUTPUT_FORMAT_DEBUG_LOG(OS_DEBUG_LOG_DEBUG, L"Warning: file %hs does not have pc-to-byte code information", fileName); delete m_pExecutable; m_pExecutable = nullptr; return false; } if (!_process_pc2bc_section()) { delete m_pExecutable; m_pExecutable = nullptr; return false; } //DumpJncPcStackInfoMap(debugFP); // Setup inline information map if (!_process_inline_map()) { delete m_pExecutable; m_pExecutable = nullptr; return false; } // DEBUG: dump the java inline entries //DumpJavaInlineMap(debugFP); // Identify the main method for this JNC if (m_jncPcStackInfoMap.empty()) { // We should be able to show the disassembly return true; } JncPcStackInfoMap::iterator it = m_jncPcStackInfoMap.begin(); m_mainMethodId = it->second->methods[it->second->numstackframes - 1]; //m_methodName = m_jncMethodMap[m_mainMethodId].name; //m_srcFile = m_jncMethodMap[m_mainMethodId].sourceName; //if (m_jncMethodMap[m_mainMethodId].lineNumberVec.size() > 0) //{ // m_startLine = m_jncMethodMap[m_mainMethodId].lineNumberVec[0].line_number; // m_possibleEndLine = // m_jncMethodMap[m_mainMethodId].lineNumberVec[m_jncMethodMap[m_mainMethodId].lineNumberVec.size() - 1].line_number; //} //m_mainInlineDepth = it->second->numstackframes; for (unsigned int i = 0; i < m_addressRangeTable.size(); i++) { if (m_addressRangeTable[i].id == m_mainMethodId) { m_addressRangeTable[i].pc_start = m_LoadAddr; } } return true; }
bool JavaJncReader::Open(const wchar_t* pWFileName) { JncPcStackInfoMap::iterator it; char fileName[261]; memset(fileName, 0, sizeof(fileName)); if (nullptr == pWFileName) { return false; } wcstombs(fileName, pWFileName, 260); ExecutableFile* pExecutable = ExecutableFile::Open(pWFileName); if (nullptr == pExecutable) { return false; } m_sectionCounts = pExecutable->GetSectionsCount(); // Get The .text section unsigned codeSecIndex = pExecutable->LookupSectionIndex(".text"); gtRVAddr codeStartRva = 0, codeEndRva = 0; pExecutable->GetSectionRvaLimits(codeSecIndex, codeStartRva, codeEndRva); m_pCodeBuf = pExecutable->GetSectionBytes(codeSecIndex); m_loadAddr = static_cast<gtRVAddr>(codeStartRva) + pExecutable->GetImageBase(); m_textOffset = codeStartRva; m_textSize = codeEndRva - codeStartRva; if (nullptr == m_pCodeBuf || m_textSize <= 0) { delete pExecutable; return false; } // Get the .stringtable m_string_table_buf = pExecutable->GetSectionBytes(pExecutable->LookupSectionIndex(".stringtable")); if (nullptr == m_string_table_buf) { // JNC Files for Native methods won't have stringtable, bc2src and pc2bc sections.. m_pExecutable = pExecutable; return true; } if (!_process_stringtable_section()) { delete pExecutable; m_pExecutable = nullptr; return false; } // Process .bc2src m_pBc2srcBuf = pExecutable->GetSectionBytes(pExecutable->LookupSectionIndex(".bc2src")); if (nullptr == m_pBc2srcBuf) { delete pExecutable; m_pExecutable = nullptr; return false; } if (!_process_bc2src_section()) { delete pExecutable; m_pExecutable = nullptr; return false; } // Process the .pc2bc m_pPc2bcBuf = pExecutable->GetSectionBytes(pExecutable->LookupSectionIndex(".pc2bc")); if (nullptr == m_pPc2bcBuf) { OS_OUTPUT_FORMAT_DEBUG_LOG(OS_DEBUG_LOG_DEBUG, L"Warning: file %hs does not have pc-to-byte code information", fileName); delete pExecutable; m_pExecutable = nullptr; return false; } if (!_process_pc2bc_section()) { delete pExecutable; m_pExecutable = nullptr; return false; } // Setup inline information map if (!_process_inline_map()) { delete pExecutable; m_pExecutable = nullptr; return false; } // DEBUG: dump the java inline entries // DumpJavaInlineMap(); // Identify the main method for this JNC if (m_jncPcStackInfoMap.empty()) { // If there is no PC stack info, we should still be able to // provide disassembly details. Hence return true; return true; } it = m_jncPcStackInfoMap.begin(); m_mainMethodId = it->second->methods[it->second->numstackframes - 1]; m_methodName = m_jncMethodMap[m_mainMethodId].name; m_srcFile = m_jncMethodMap[m_mainMethodId].sourceName; if (m_jncMethodMap[m_mainMethodId].lineNumberVec.size() > 0) { m_startLine = m_jncMethodMap[m_mainMethodId].lineNumberVec[0].line_number; m_possibleEndLine = m_jncMethodMap[m_mainMethodId].lineNumberVec[m_jncMethodMap[m_mainMethodId].lineNumberVec.size() - 1].line_number; } m_mainInlineDepth = it->second->numstackframes; for (unsigned int i = 0; i < m_addressRangeTable.size(); i++) { if (m_addressRangeTable[i].id == m_mainMethodId) { m_addressRangeTable[i].pc_start = m_loadAddr; } } m_pExecutable = pExecutable; return true; }