mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 08:27:45 +00:00
LibELF: Move the implementation of find_demangled_function to ELF::Image
This commit is contained in:
parent
0220b5361e
commit
93b68f5566
4 changed files with 26 additions and 20 deletions
|
@ -24,6 +24,7 @@
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <AK/Demangle.h>
|
||||||
#include <AK/Memory.h>
|
#include <AK/Memory.h>
|
||||||
#include <AK/StringBuilder.h>
|
#include <AK/StringBuilder.h>
|
||||||
#include <AK/StringView.h>
|
#include <AK/StringView.h>
|
||||||
|
@ -301,4 +302,23 @@ StringView Image::Symbol::raw_data() const
|
||||||
return { section.raw_data() + (value() - section.address()), size() };
|
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
|
} // end namespace ELF
|
||||||
|
|
|
@ -208,6 +208,8 @@ public:
|
||||||
FlatPtr base_address() const { return (FlatPtr)m_buffer; }
|
FlatPtr base_address() const { return (FlatPtr)m_buffer; }
|
||||||
size_t size() const { return m_size; }
|
size_t size() const { return m_size; }
|
||||||
|
|
||||||
|
Optional<Symbol> find_demangled_function(const String& name) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const char* raw_data(unsigned offset) const;
|
const char* raw_data(unsigned offset) const;
|
||||||
const Elf32_Ehdr& header() const;
|
const Elf32_Ehdr& header() const;
|
||||||
|
|
|
@ -144,25 +144,6 @@ bool Loader::layout()
|
||||||
return !failed;
|
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
|
#ifndef KERNEL
|
||||||
Optional<Image::Symbol> Loader::find_symbol(u32 address, u32* out_offset) const
|
Optional<Image::Symbol> Loader::find_symbol(u32 address, u32* out_offset) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -59,7 +59,10 @@ public:
|
||||||
return m_image.entry();
|
return m_image.entry();
|
||||||
}
|
}
|
||||||
const Image& image() const { return m_image; }
|
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; }
|
bool has_symbols() const { return m_symbol_count; }
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue