From 8f75c455ab41abe709e6e801cf360dbe079d5ffa Mon Sep 17 00:00:00 2001 From: Tamas Berghammer Date: Tue, 26 Jan 2016 18:03:43 +0000 Subject: [PATCH] Emit symbol names for trampoline symbols in oatdump Modify the symbolizer functionality of oatdump to emit symbols for the trampolines in the begining of each oat file. Change-Id: I083c160ff54784f904743f87bcc18881e6ce0603 --- oatdump/oatdump.cc | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/oatdump/oatdump.cc b/oatdump/oatdump.cc index 57b52fcdd..5c0d91601 100644 --- a/oatdump/oatdump.cc +++ b/oatdump/oatdump.cc @@ -155,6 +155,7 @@ class OatSymbolizer FINAL { strtab->Start(); strtab->Write(""); // strtab should start with empty string. + AddTrampolineSymbols(); Walk(&art::OatSymbolizer::AddSymbol); strtab->End(); @@ -167,6 +168,33 @@ class OatSymbolizer FINAL { return builder_->Good(); } + void AddTrampolineSymbol(const char* name, uint32_t code_offset) { + if (code_offset != 0) { + uint32_t name_offset = builder_->GetStrTab()->Write(name); + uint64_t symbol_value = code_offset - oat_file_->GetOatHeader().GetExecutableOffset(); + builder_->GetSymTab()->Add(name_offset, builder_->GetText(), symbol_value, + /* is_relative */ true, /* size */ 0, STB_GLOBAL, STT_FUNC); + } + } + + void AddTrampolineSymbols() { + const OatHeader& oat_header = oat_file_->GetOatHeader(); + AddTrampolineSymbol("interpreterToInterpreterBridge", + oat_header.GetInterpreterToInterpreterBridgeOffset()); + AddTrampolineSymbol("interpreterToCompiledCodeBridge", + oat_header.GetInterpreterToCompiledCodeBridgeOffset()); + AddTrampolineSymbol("jniDlsymLookup", + oat_header.GetJniDlsymLookupOffset()); + AddTrampolineSymbol("quickGenericJniTrampoline", + oat_header.GetQuickGenericJniTrampolineOffset()); + AddTrampolineSymbol("quickImtConflictTrampoline", + oat_header.GetQuickImtConflictTrampolineOffset()); + AddTrampolineSymbol("quickResolutionTrampoline", + oat_header.GetQuickResolutionTrampolineOffset()); + AddTrampolineSymbol("quickToInterpreterBridge", + oat_header.GetQuickToInterpreterBridgeOffset()); + } + void Walk(Callback callback) { std::vector oat_dex_files = oat_file_->GetOatDexFiles(); for (size_t i = 0; i < oat_dex_files.size(); i++) { -- 2.11.0