LibELF: Move the implementation of find_demangled_function to ELF::Image

This commit is contained in:
Itamar 2020-11-28 15:04:20 +02:00 committed by Andreas Kling
parent 0220b5361e
commit 93b68f5566
Notes: sideshowbarker 2024-07-19 00:50:19 +09:00
4 changed files with 26 additions and 20 deletions

View File

@ -24,6 +24,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <AK/Demangle.h>
#include <AK/Memory.h>
#include <AK/StringBuilder.h>
#include <AK/StringView.h>
@ -301,4 +302,23 @@ StringView Image::Symbol::raw_data() const
return { section.raw_data() + (value() - section.address()), size() };
}
Optional<Image::Symbol> Image::find_demangled_function(const String& name) const
{
Optional<Image::Symbol> found;
for_each_symbol([&](const Image::Symbol symbol) {
if (symbol.type() != STT_FUNC)
return IterationDecision::Continue;
auto demangled = demangle(symbol.name());
auto index_of_paren = demangled.index_of("(");
if (index_of_paren.has_value()) {
demangled = demangled.substring(0, index_of_paren.value());
}
if (demangled != name)
return IterationDecision::Continue;
found = symbol;
return IterationDecision::Break;
});
return found;
}
} // end namespace ELF

View File

@ -208,6 +208,8 @@ public:
FlatPtr base_address() const { return (FlatPtr)m_buffer; }
size_t size() const { return m_size; }
Optional<Symbol> find_demangled_function(const String& name) const;
private:
const char* raw_data(unsigned offset) const;
const Elf32_Ehdr& header() const;

View File

@ -144,25 +144,6 @@ bool Loader::layout()
return !failed;
}
Optional<Image::Symbol> Loader::find_demangled_function(const String& name) const
{
Optional<Image::Symbol> found;
m_image.for_each_symbol([&](const Image::Symbol symbol) {
if (symbol.type() != STT_FUNC)
return IterationDecision::Continue;
auto demangled = demangle(symbol.name());
auto index_of_paren = demangled.index_of("(");
if (index_of_paren.has_value()) {
demangled = demangled.substring(0, index_of_paren.value());
}
if (demangled != name)
return IterationDecision::Continue;
found = symbol;
return IterationDecision::Break;
});
return found;
}
#ifndef KERNEL
Optional<Image::Symbol> Loader::find_symbol(u32 address, u32* out_offset) const
{

View File

@ -59,7 +59,10 @@ public:
return m_image.entry();
}
const Image& image() const { return m_image; }
Optional<Image::Symbol> find_demangled_function(const String& name) const;
Optional<Image::Symbol> find_demangled_function(const String& name) const
{
return m_image.find_demangled_function(name);
}
bool has_symbols() const { return m_symbol_count; }