diff options
Diffstat (limited to 'Userland/Libraries/LibELF/Image.cpp')
-rw-r--r-- | Userland/Libraries/LibELF/Image.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/Userland/Libraries/LibELF/Image.cpp b/Userland/Libraries/LibELF/Image.cpp index bd66b3f165..895c768923 100644 --- a/Userland/Libraries/LibELF/Image.cpp +++ b/Userland/Libraries/LibELF/Image.cpp @@ -421,7 +421,16 @@ Optional<Image::Symbol> Image::find_symbol(FlatPtr address, u32* out_offset) con NEVER_INLINE void Image::sort_symbols() const { m_sorted_symbols.ensure_capacity(symbol_count()); - for_each_symbol([this](auto const& symbol) { + bool const is_aarch64 = header().e_machine == EM_AARCH64; + for_each_symbol([this, is_aarch64](auto const& symbol) { + // The AArch64 ABI marks the boundaries of literal pools in a function with $x/$d. + // https://github.com/ARM-software/abi-aa/blob/2023q1-release/aaelf64/aaelf64.rst#mapping-symbols + // Skip them so we don't accidentally print these instead of function names. + if (is_aarch64 && (symbol.name().starts_with("$x"sv) || symbol.name().starts_with("$d"sv))) + return; + // STT_SECTION has the same address as the first function in the section, but shows up as the empty string. + if (symbol.type() == STT_SECTION) + return; m_sorted_symbols.append({ symbol.value(), symbol.name(), {}, symbol }); }); quick_sort(m_sorted_symbols, [](auto& a, auto& b) { |