From eb3a17d47550037934b600633d3f48af832bf9c1 Mon Sep 17 00:00:00 2001 From: Peter Matula Date: Wed, 25 Sep 2024 11:21:36 +0200 Subject: [PATCH] fileformat/elf: use ptrs in import cache instead of refs --- src/fileformat/file_format/elf/elf_format.cpp | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/fileformat/file_format/elf/elf_format.cpp b/src/fileformat/file_format/elf/elf_format.cpp index 96ad48da0..3c895f70f 100644 --- a/src/fileformat/file_format/elf/elf_format.cpp +++ b/src/fileformat/file_format/elf/elf_format.cpp @@ -1750,7 +1750,19 @@ void ElfFormat::loadSymbols(const ELFIO::elfio *file, const ELFIO::symbol_sectio // To save space, this uses string references and relies on imports not // being moved -- they should not be, as ImportTable stores vector of unique // pointers, but if that ever changes, this will end badly. - std::set> createdImports; + auto createdImportsComparator = []( + const std::pair& lhs, + const std::pair& rhs + ) { + if (*(lhs.first) != *(rhs.first)) { + return *(lhs.first) < *(rhs.first); + } + return lhs.second < rhs.second; + }; + std::set< + std::pair, + decltype(createdImportsComparator) + > createdImports(createdImportsComparator); for(std::size_t i = 0, e = elfSymbolTable->get_loaded_symbols_num(); i < e; ++i) { @@ -1795,7 +1807,7 @@ void ElfFormat::loadSymbols(const ELFIO::elfio *file, const ELFIO::symbol_sectio std::set> addresses; for (auto it = keyIter.first; it != keyIter.second; ++it) { - if (createdImports.count({std::cref(it->first), it->second})) { + if (!createdImports.count({&it->first, it->second})) { addresses.insert(*it); } } @@ -1809,7 +1821,7 @@ void ElfFormat::loadSymbols(const ELFIO::elfio *file, const ELFIO::symbol_sectio auto* inserted = importTable->addImport(std::move(import)); if (inserted) { - createdImports.emplace(inserted->getName(), inserted->getAddress()); + createdImports.emplace(&inserted->getName(), inserted->getAddress()); } } if(keyIter.first == keyIter.second && getSectionFromAddress(value)) @@ -1821,7 +1833,7 @@ void ElfFormat::loadSymbols(const ELFIO::elfio *file, const ELFIO::symbol_sectio auto* inserted = importTable->addImport(std::move(import)); if (inserted) { - createdImports.emplace(inserted->getName(), inserted->getAddress()); + createdImports.emplace(&inserted->getName(), inserted->getAddress()); } } }