Simpleperf: support reading symbols from .gnu_debugdata.
As in https://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html,
elf files can store mini debug information in .gnu_debugdata.
Bug: 27744639
Change-Id: If4a53a4a1332824388ee309ac63a008dc5cf8d5c
diff --git a/simpleperf/read_elf_test.cpp b/simpleperf/read_elf_test.cpp
index 929540f..f2649e0 100644
--- a/simpleperf/read_elf_test.cpp
+++ b/simpleperf/read_elf_test.cpp
@@ -20,6 +20,7 @@
#include <map>
#include "get_test_data.h"
+#include "test_util.h"
TEST(read_elf, GetBuildIdFromElfFile) {
BuildId build_id;
@@ -38,16 +39,24 @@
(*symbols)[symbol.name] = symbol;
}
-void CheckElfFileSymbols(const std::map<std::string, ElfFileSymbol>& symbols) {
+static void CheckGlobalVariableSymbols(const std::map<std::string, ElfFileSymbol>& symbols) {
auto pos = symbols.find("GlobalVar");
ASSERT_NE(pos, symbols.end());
ASSERT_FALSE(pos->second.is_func);
- pos = symbols.find("GlobalFunc");
+}
+
+static void CheckFunctionSymbols(const std::map<std::string, ElfFileSymbol>& symbols) {
+ auto pos = symbols.find("GlobalFunc");
ASSERT_NE(pos, symbols.end());
ASSERT_TRUE(pos->second.is_func);
ASSERT_TRUE(pos->second.is_in_text_section);
}
+void CheckElfFileSymbols(const std::map<std::string, ElfFileSymbol>& symbols) {
+ CheckGlobalVariableSymbols(symbols);
+ CheckFunctionSymbols(symbols);
+}
+
TEST(read_elf, parse_symbols_from_elf_file_with_correct_build_id) {
std::map<std::string, ElfFileSymbol> symbols;
ASSERT_TRUE(ParseSymbolsFromElfFile(GetTestData(ELF_FILE), elf_file_build_id,
@@ -77,6 +86,13 @@
CheckElfFileSymbols(symbols);
}
+TEST(read_elf, ParseSymbolFromMiniDebugInfoElfFile) {
+ std::map<std::string, ElfFileSymbol> symbols;
+ ASSERT_TRUE(ParseSymbolsFromElfFile(GetTestData(ELF_FILE_WITH_MINI_DEBUG_INFO), BuildId(),
+ std::bind(ParseSymbol, std::placeholders::_1, &symbols)));
+ CheckFunctionSymbols(symbols);
+}
+
TEST(read_elf, arm_mapping_symbol) {
ASSERT_TRUE(IsArmMappingSymbol("$a"));
ASSERT_FALSE(IsArmMappingSymbol("$b"));