diff --git a/addr2line.cc b/addr2line.cc index f8fe964..af9fba1 100644 --- a/addr2line.cc +++ b/addr2line.cc @@ -26,6 +26,7 @@ #include "llvm/DebugInfo/DWARF/DWARFFormValue.h" #include "llvm/Object/Binary.h" #include "llvm/Object/ObjectFile.h" +#include "llvm/Support/Error.h" ABSL_RETIRED_FLAG(bool, use_legacy_symbolizer, false, "whether to use google3 symbolizer"); @@ -87,8 +88,29 @@ void LLVMAddr2line::GetInlineStack(uint64_t address, SourceStack *stack) const { llvm::SmallVector InlinedChain; cu_iter->second->getInlinedChainForAddress(address, InlinedChain); - uint32_t row_index = line_table->lookupAddress( - {address, llvm::object::SectionedAddress::UndefSection}); + uint64_t section_index = llvm::object::SectionedAddress::UndefSection; + if (IsKernelModule(getObject()->getFileName())) { + // For kernel modules (relocatable objects), line table sequences are often + // tied to their actual section. We must provide the actual section index + // (instead of the UndefSection wildcard) to lookupAddress, otherwise it + // will fail to match sequences that are not marked as UndefSection. We + // only focus on the .text section to be consistent with symbol_map.cc. + for (const auto& sec : getObject()->sections()) { + auto name = sec.getName(); + if (!name) { + llvm::consumeError(name.takeError()); + continue; + } + if (*name == ".text") { + if (address >= sec.getAddress() && + address < sec.getAddress() + sec.getSize()) { + section_index = sec.getIndex(); + } + break; + } + } + } + uint32_t row_index = line_table->lookupAddress({address, section_index}); uint32_t file = (row_index == -1U ? -1U : line_table->Rows[row_index].File); uint32_t line = (row_index == -1U ? 0 : line_table->Rows[row_index].Line); uint32_t discriminator = diff --git a/addr2line.h b/addr2line.h index 4e3d655..dcafb59 100644 --- a/addr2line.h +++ b/addr2line.h @@ -13,6 +13,7 @@ #include "base/integral_types.h" #include "source_info.h" +#include "third_party/abseil/absl/strings/match.h" #include "third_party/abseil/absl/strings/string_view.h" #if defined(HAVE_LLVM) @@ -89,6 +90,11 @@ class Google3Addr2line : public Addr2line { DISALLOW_COPY_AND_ASSIGN(Google3Addr2line); }; #endif + +inline bool IsKernelModule(absl::string_view path) { + return absl::EndsWith(path, ".ko"); +} + } // namespace devtools_crosstool_autofdo #endif // AUTOFDO_ADDR2LINE_H_ diff --git a/symbol_map.cc b/symbol_map.cc index 2a8d949..355df2f 100644 --- a/symbol_map.cc +++ b/symbol_map.cc @@ -478,6 +478,18 @@ void SymbolMap::ReadLoadableExecSegmentInfo(bool is_kernel) { << " vaddr=" << info.vaddr; } } + + if (si_vec.empty() && IsKernelModule(binary_)) { + // For kernel modules without program headers, we simulate a loadable + // executable segment by using the file offset and link-time address of the + // .text section. We focus on .text and ignore other executable sections + // like .init.text and .exit.text as they are not important for steady-state + // performance. + ElfReader::SectionInfo info; + if (elf_reader.GetSectionInfoByName(".text", &info) != nullptr) { + add_loadable_exec_segment(info.offset, info.addr); + } + } } void SymbolMap::BuildSymbolMap() { diff --git a/symbol_map_test.cc b/symbol_map_test.cc index 9892363..9fec3b0 100644 --- a/symbol_map_test.cc +++ b/symbol_map_test.cc @@ -16,6 +16,7 @@ #include "base/logging.h" #include "llvm_profile_reader.h" #include "source_info.h" +#include "util/symbolize/elf_reader.h" #include "gtest/gtest.h" #include "third_party/abseil/absl/container/node_hash_set.h" #include "third_party/abseil/absl/flags/flag.h" @@ -524,4 +525,20 @@ TEST(AddressConversion, OffsetToVaddr) { EXPECT_EQ(symbol_map.GetFileOffsetFromStaticVaddr(0x001010), 0x002010); } +TEST(AddressConversion, KernelModuleFakeSegment) { + SymbolMap symbol_map(absl::StrCat(testing::SrcDir(), kTestDataDir, + "test_kernel_module.ko")); + symbol_map.ReadLoadableExecSegmentInfo(/*is_kernel=*/false); + + // Use ElfReader to get the actual .text section info from the test file. + devtools_crosstool_autofdo::ElfReader elf_reader( + absl::StrCat(testing::SrcDir(), kTestDataDir, "test_kernel_module.ko")); + devtools_crosstool_autofdo::ElfReader::SectionInfo info; + ASSERT_TRUE(elf_reader.GetSectionInfoByName(".text", &info) != nullptr); + + // Verify that the fake segment maps the file offset to the address correctly. + EXPECT_EQ(symbol_map.GetFileOffsetFromStaticVaddr(info.addr), info.offset); + EXPECT_EQ(symbol_map.get_static_vaddr(info.offset), info.addr); +} + } // namespace diff --git a/testdata/test_kernel_module.ko b/testdata/test_kernel_module.ko new file mode 100644 index 0000000..a1d685a Binary files /dev/null and b/testdata/test_kernel_module.ko differ diff --git a/testdata/test_kernel_module.textprof b/testdata/test_kernel_module.textprof new file mode 100644 index 0000000..8ce558a --- /dev/null +++ b/testdata/test_kernel_module.textprof @@ -0,0 +1,641 @@ +340 +262c-2640:1 +2638-2640:3 +2644-264c:4 +2650-2650:4 +2654-265c:1 +2664-266c:1 +2670-2684:1 +2774-2778:1485 +2784-27ac:3714 +27a8-27ac:1 +2800-2808:3924 +2808-2808:1 +280c-2820:4365 +2814-2820:1 +2818-2820:2 +2828-2828:4595 +282c-282c:1 +282c-2834:1878127 +2830-2834:1 +2840-2848:4 +287c-287c:4 +28d8-28f0:2679 +2a48-2a74:4 +2a74-2a74:4 +2a78-2a84:2679 +2a84-2a84:2679 +2a88-2a9c:2679 +2aa0-2ab4:2679 +2ab4-2ab4:5358 +2ab8-2ac8:2679 +2acc-2ae4:2679 +2bfc-2c04:1 +2c40-2c54:1 +2c4c-2c54:3 +2c58-2c60:4 +2c64-2c64:4 +2c68-2c6c:1 +2c70-2c98:1 +2ca0-2ca0:1 +2ca4-2ca4:1 +2cd0-2ce4:1 +2ce8-2cf4:1 +2cf8-2d00:1 +2d10-2d14:1 +2d1c-2d78:5138 +2d7c-2d84:1878204 +2d88-2d94:1878204 +2d98-2d9c:1878196 +2dcc-2dd4:1878196 +2dd4-2dd4:219116 +2dd8-2de0:1878192 +2de4-2df8:1878180 +2df8-2df8:1878176 +2df8-4950:1 +2dfc-2e00:1 +2dfc-2e1c:1878125 +2e04-2e1c:1 +3060-3078:7 +307c-3084:2678 +308c-30a4:1 +30a8-30b0:2678 +3154-3180:2 +440c-4434:2680 +4438-443c:2680 +4440-4444:2679 +4448-445c:2679 +445c-445c:5350 +4460-4460:2679 +4464-4468:1 +4474-4494:1 +4498-44ac:1 +449c-44ac:2679 +491c-4954:3 +4954-4954:1 +4958-4958:1878164 +4980-4988:1870798 +498c-4990:1878164 +4994-4998:1878164 +49d0-49d4:1 +49d0-49d8:1 +49d0-49f0:1878167 +49d8-49f0:1 +49dc-49f0:1 +4a20-4a2c:1 +4a20-4a30:1 +4a20-4a34:1 +4a20-4a38:1 +4a20-4a40:3 +4a20-4a50:1 +4a20-4a58:1878168 +4a30-4a58:1 +4a34-4a58:1 +4a38-4a58:1 +4a3c-4a58:1 +4a44-4a58:3 +4a54-4a58:1 +4a58-4a58:24854 +4a5c-4a5c:1878156 +4a60-4a64:1878156 +4a84-4a88:7 +4a88-4a88:2 +4a8c-4a94:1878131 +4a98-4a98:4341 +4abc-4acc:4341 +4ae0-4af4:1873793 +4af8-4b0c:1878163 +4b00-4b0c:3747777 +4b00-4c30:1 +4b10-4b14:1872412 +4b18-4b18:1871332 +4b1c-4b30:1878149 +4b24-4b30:209252 +4bcc-4c44:1127837 +4c20-4c44:1 +4c34-4c44:1 +4c48-4c48:3074 +4c4c-4c4c:3074 +4c50-4c84:3073 +4c7c-4c84:1125858 +4c88-4c88:1129867 +4c8c-4c90:1130464 +4c94-4ca0:947895 +4ca0-4ca0:21425 +4ca4-4cb8:950969 +4d2c-4d34:483 +4d6c-4d98:11 +4d88-4d98:180032 +4d98-4d98:1 +4e50-4e68:483 +4e70-4e84:950969 +4e78-4e84:950957 +5004-5050:13 +5048-5050:2 +5050-5050:15 +5054-5060:2695 +5060-5060:15 +5064-5070:2680 +5074-5080:2680 +5084-5094:2680 +5098-509c:2680 +52f4-530c:2680 +5edc-5ef4:1 +5ef8-5f04:1 +5f08-5f30:1 +5f24-5f30:7 +5f34-5f78:7 +5f7c-5f84:1 +5f88-5f98:1 +5f9c-5fc4:1 +5ffc-600c:1 +6010-6010:1 +6014-601c:1 +6020-602c:1 +6030-6034:1 +6038-6054:1 +6058-6070:1 +6060-6070:170349 +6074-607c:170352 +6080-608c:170351 +6090-6098:170350 +609c-60a0:1 +60a4-60a8:1 +60ac-60c0:1 +60c4-60e0:1 +60e4-60e4:3 +60e8-60fc:1 +6110-6118:1 +612c-6134:1 +6148-6158:1 +615c-615c:1 +6160-616c:1 +6170-6170:1 +6174-6180:1 +6184-6184:1 +6188-6194:1 +6198-6198:1 +619c-61a4:1 +61a8-61b4:1 +6218-6230:1 +6234-6244:1 +6248-6254:1 +6258-6264:1 +6268-627c:1 +6284-62c0:1878192 +62c4-62c4:1878192 +62c8-62cc:1878190 +62d0-62d4:1878188 +62d4-62d4:46652 +62d8-62ec:1878172 +62f0-631c:1878121 +6320-6368:1878174 +6380-6388:1878173 +638c-6390:1 +638c-6398:1878173 +6394-6398:1 +63b4-63c0:1 +63b4-63cc:1878179 +63c4-63cc:1 +63cc-63cc:5625420 +63d0-63d0:3751937 +63d4-63e8:1878124 +63e8-63e8:1 +63ec-63f4:1 +63ec-6408:1 +63ec-640c:1 +63ec-6420:1878119 +63f8-6420:1 +640c-6420:1 +6410-6420:1 +6420-6420:47313 +6424-642c:1878114 +6430-6440:1878117 +6444-6444:1878117 +652c-6530:2 +6534-654c:2 +6550-657c:2 +6580-65d8:2 +65d8-65d8:4 +65dc-65dc:4 +65e0-65e4:2 +65e8-65fc:2 +6600-6634:2 +6638-6640:2 +6644-6650:2 +6654-6654:2 +6658-666c:1873587 +6660-666c:1878121 +666c-666c:73497 +6670-6678:1878117 +669c-66b0:2 +66a4-66b0:2 +66b4-66bc:2 +66c0-66c4:1878119 +66c8-66e4:1 +66c8-66e8:1878120 +66e8-66e8:1 +67b0-67c8:3 +67cc-67cc:3 +67d0-67ec:3 +67fc-681c:953748 +683c-683c:953742 +6840-6844:1 +6840-684c:953741 +6848-684c:1 +6850-6858:953749 +685c-685c:953752 +6898-68a4:953752 +68a4-68a4:15119 +68a8-68a8:953737 +68bc-68cc:953741 +6998-69c4:1 +69c8-69c8:1 +69cc-69d4:1 +69d8-69dc:1 +69e0-69f0:1 +69f4-69f8:1 +69fc-6a04:1 +6a08-6a0c:1 +6a10-6a14:1 +6a18-6a2c:1 +6a1c-6a20:1 +6a1c-6a2c:1489662 +6a24-6a2c:1 +6a30-6a38:1 +6a3c-6a48:1 +6a48-6a48:1 +6a4c-6a50:1 +6a54-6a68:1 +6a98-6a9c:1 +6acc-6ad0:1 +6b00-6b0c:1 +6b10-6b10:1 +6b2c-6b30:1 +6b34-6b4c:1 +6c44-6c84:1 +6c88-6c88:1 +6c94-6c98:1 +6c9c-6cac:1 +6cb0-6cb8:1 +6cbc-6cc4:1 +6ce0-6cec:1 +6cf0-6cf4:1 +6cf8-6cfc:1 +6d00-6d04:1 +6d08-6d10:1 +6d14-6d24:1 +6d28-6d40:1 +7094-70b4:1 +70b8-70d0:1 +70d4-70f8:1 +70fc-7100:1 +710c-7118:1 +711c-711c:1 +7120-7124:1 +7128-7134:1 +7138-7140:1 +7140-7140:1 +7144-7144:1 +7148-7148:1 +7158-715c:1 +7160-7164:1 +7168-717c:1 +7184-718c:1 +7190-7194:1 +71ac-71bc:1 +7e60-7e98:3 +7e9c-7ea0:3 +7ea4-7ea8:3 +7eac-7ebc:3 +7ec0-7ec4:3 +7ecc-7f20:3 +7f24-7f2c:3 +7f30-7f40:3 +7f44-7f5c:3 +91e0-9210:4 +9214-9228:4 +922c-9230:4 +9234-9248:4 +924c-9260:4 +926c-928c:4 +9290-9294:4 +9298-929c:4 +92a0-92a4:4 +92ac-92b0:4 +92b4-92d4:4 +93ec-9404:2678 +9408-942c:2678 +942c-942c:5326 +9430-9430:5337 +9434-9438:2678 +943c-9444:2678 +9444-9444:2671 +9448-9450:2678 +9450-9450:2676 +9454-945c:2678 +945c-945c:2677 +9460-9464:2678 +9468-946c:2678 +9480-9498:2678 +9488-9498:2659 +0 +297 +264c->264c:4 +2650->2638:3 +265c->2664:1 +266c->266c:1 +2684->1c68:1 +2778->2784:1485 +27ac->2800:3715 +2820->2828:4368 +2828->1c68:4595 +2834->1c68:1878128 +2848->287c:4 +287c->1c68:4 +28f0->1c68:2679 +2a74->2a74:4 +2a74->2a78:4 +2a84->2a84:2679 +2a84->2a88:2679 +2a9c->2a9c:2679 +2ab4->2ab4:8037 +2ac8->2ac8:2679 +2ae4->1c68:2679 +2c04->1c68:1 +2c60->2c60:4 +2c64->2c4c:3 +2c98->2ca0:1 +2ca0->1c68:1 +2ca4->2ce8:1 +2ce4->1c68:1 +2cf4->2cf4:1 +2d00->2d10:1 +2d14->2cd0:1 +2d78->2d78:5138 +2d94->2d94:1878199 +2d94->4c7c:1 +2d94->6320:1 +2d94->63b4:2 +2d94->63d4:1 +2d9c->2dcc:1878196 +2dd4->2d1c:1 +2dd4->2dd4:2097309 +2dd4->4a20:1 +2dd4->4bcc:1 +2de0->2784:1 +2de0->282c:2 +2de0->2d1c:1 +2de0->2de0:1878183 +2de0->2dfc:2 +2de0->49d0:1 +2de0->4bcc:1 +2de0->63b4:1 +2df8->2d1c:1 +2df8->2df8:3756351 +2df8->491c:3 +2df8->62f0:1 +2e1c->1c68:1878126 +3078->3078:7 +3084->1c68:2678 +30a4->30a4:1 +30b0->1c68:2678 +3180->1c68:2 +443c->4464:1 +445c->2a48:4 +445c->2a78:2675 +445c->445c:5350 +4460->449c:2679 +4468->4474:1 +4494->4494:1 +44ac->1c68:2680 +4954->4954:4 +4958->4980:1 +4958->4af8:1878163 +4988->282c:2 +4988->2d1c:1 +4988->498c:1870784 +4988->4bcc:10 +4988->4c88:1 +4998->49d0:1878164 +49f0->4a20:1878169 +4a58->2dfc:1 +4a58->4a58:1878174 +4a58->6660:1 +4a64->4a84:7 +4a64->4b1c:1878149 +4a88->4a88:7 +4a88->4a8c:2 +4a94->4ae0:1873790 +4a98->4abc:4341 +4acc->2dfc:4341 +4af4->1c68:1873793 +4b0c->4b00:3747778 +4b0c->4bcc:3730 +4b0c->4c7c:1087 +4b18->4980:1870797 +4b18->4d88:535 +4b30->2784:1 +4b30->282c:2 +4b30->49d0:1 +4b30->4a20:2 +4b30->4a8c:209346 +4b30->4b24:1878045 +4b30->4bcc:1 +4b30->638c:1 +4b30->63b4:1 +4b30->6430:1 +4c44->4c7c:1124765 +4c88->4d2c:483 +4c90->4d88:182569 +4ca0->4bcc:1 +4ca0->4c7c:1 +4ca0->4ca0:947892 +4ca0->68bc:1 +4cb8->4e70:950969 +4d34->4e50:483 +4d98->1c68:180044 +4e68->6850:483 +4e84->4c7c:1 +4e84->4d6c:11 +4e84->4e78:950960 +4e84->6080:1 +4e84->6850:950952 +4e84->68bc:1 +5050->5050:15 +5060->5054:15 +5060->5060:2695 +5080->440c:2680 +5094->5094:2680 +509c->52f4:2680 +530c->1c68:2680 +5ef4->5ef4:1 +5f04->5f04:1 +5f30->5f7c:1 +5f78->5f24:7 +5f84->6030:1 +5f98->60c4:1 +5fc4->5ffc:1 +6010->6010:1 +601c->601c:1 +602c->1c68:1 +6070->6070:170350 +607c->4bcc:170352 +608c->608c:170351 +6098->6060:170349 +60a0->60a0:1 +60a8->60a8:1 +60c0->1c68:1 +60e4->60e4:3 +60fc->6110:1 +6118->612c:1 +6134->6148:1 +615c->615c:1 +6170->6170:1 +6184->6184:1 +6198->6198:1 +61a4->6218:1 +61b4->1c68:1 +6230->6230:1 +6244->6244:1 +6254->6254:1 +6264->6264:1 +627c->1c68:1 +62c4->652c:2 +62d4->282c:2 +62d4->2d1c:1 +62d4->49d0:1 +62d4->4a20:1 +62d4->62d4:1924833 +62d4->63b4:1 +62d4->6430:1 +62ec->6320:1878172 +631c->6660:1878120 +6368->6380:1878174 +6398->63b4:1878174 +63cc->2774:1483 +63cc->2784:2226 +63cc->2800:208 +63cc->282c:1 +63cc->63cc:5625423 +63d0->2828:227 +63d0->6658:1873587 +63e8->282c:1 +63e8->2dfc:2 +63e8->63e8:1878121 +6420->2774:1 +6420->2784:1 +6420->282c:3 +6420->2d1c:2 +6420->49d0:1 +6420->4c7c:1 +6420->62d8:1 +6420->6420:1878112 +642c->62f0:1 +6444->62f0:1878116 +6444->63b4:1 +6530->6530:2 +654c->6580:2 +657c->66a4:2 +65d8->65d8:4 +65dc->669c:2 +65e4->65e4:2 +65fc->65fc:2 +6634->6634:2 +6654->6550:2 +666c->282c:2 +666c->2d1c:1 +666c->2dfc:1 +666c->4a20:3 +666c->4ae0:1 +666c->4bcc:3 +666c->4c7c:1 +666c->4d88:1 +666c->62f0:1 +666c->666c:3825190 +6678->66c0:1878117 +66b0->5054:2 +66b0->66b0:2 +66c4->2774:1 +66c4->49d0:1 +66c4->66c4:1878116 +66e8->1c68:1878121 +67c8->67c8:3 +67ec->1c68:3 +681c->68bc:1 +681c->68d0:953747 +684c->4bcc:953742 +6858->4bcc:1 +6858->6858:953747 +6858->68bc:1 +685c->6898:953752 +68a4->4bcc:3 +68a4->4c7c:2 +68a4->68a4:953747 +68a8->68bc:953737 +68cc->1c68:953741 +69c4->69c4:1 +69d4->69d4:1 +69f0->69f0:1 +6a04->6a04:1 +6a2c->6a1c:1489663 +6a48->6a48:2 +6a68->6a98:1 +6a9c->6acc:1 +6ad0->6b00:1 +6b0c->6b0c:1 +6b10->6b2c:1 +6b30->6b30:1 +6b4c->1c68:1 +6c84->6c84:1 +6c88->6c94:1 +6cac->6cac:1 +6cc4->6ce0:1 +6cec->6cec:1 +6cf4->6cf4:1 +6cfc->5edc:1 +6d04->6d04:1 +6d10->6d10:1 +6d40->1c68:1 +70b4->70d4:1 +70d0->1c68:1 +70f8->70f8:1 +7100->710c:1 +7118->7118:1 +7140->7140:2 +7148->7158:1 +715c->715c:1 +717c->7184:1 +718c->718c:1 +7194->71ac:1 +71bc->1c68:1 +7e98->7e98:3 +7ea8->7ea8:3 +7ebc->7ebc:3 +7ec4->7ecc:3 +7f20->7f20:3 +7f2c->7f2c:3 +7f5c->1c68:3 +9210->9210:4 +9228->9228:4 +9230->9230:4 +9260->1c68:4 +928c->928c:4 +929c->929c:4 +92a4->92ac:4 +92b0->92b0:4 +92d4->1c68:4 +942c->5004:13 +942c->942c:5328 +9430->9488:2659 +9438->9438:2678 +9444->3060:7 +9444->9444:5342 +9450->3154:2 +9450->9450:2676 +9450->9454:2676 +945c->308c:1 +945c->945c:5354 +946c->94a4:2678 +9498->1c68:5337 +