summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Libraries/LibELF/Image.cpp20
-rw-r--r--Libraries/LibELF/Image.h2
-rw-r--r--Libraries/LibELF/Loader.cpp19
-rw-r--r--Libraries/LibELF/Loader.h5
4 files changed, 26 insertions, 20 deletions
diff --git a/Libraries/LibELF/Image.cpp b/Libraries/LibELF/Image.cpp
index 8a5b7f56d8..d91c9558ab 100644
--- a/Libraries/LibELF/Image.cpp
+++ b/Libraries/LibELF/Image.cpp
@@ -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
diff --git a/Libraries/LibELF/Image.h b/Libraries/LibELF/Image.h
index 5253ec8aa6..fb45e0e562 100644
--- a/Libraries/LibELF/Image.h
+++ b/Libraries/LibELF/Image.h
@@ -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;
diff --git a/Libraries/LibELF/Loader.cpp b/Libraries/LibELF/Loader.cpp
index 1260a862b9..d585dc4b05 100644
--- a/Libraries/LibELF/Loader.cpp
+++ b/Libraries/LibELF/Loader.cpp
@@ -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
{
diff --git a/Libraries/LibELF/Loader.h b/Libraries/LibELF/Loader.h
index adb3b0b17c..cafbcdca6c 100644
--- a/Libraries/LibELF/Loader.h
+++ b/Libraries/LibELF/Loader.h
@@ -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; }