Browse Source

Kernel+LibELF: Don't demangle symbols in the kernel

Instead we should just generate kernel.map in such a way that it already
contains demangled symbols.
Gunnar Beutner 4 years ago
parent
commit
67f0c0d5f0

+ 1 - 1
Kernel/CMakeLists.txt

@@ -413,7 +413,7 @@ if (ENABLE_KERNEL_LTO)
     check_ipo_supported()
     set_property(TARGET ${KERNEL_TARGET} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
 endif()
-target_link_libraries(${KERNEL_TARGET} kernel_heap gcc supc++)
+target_link_libraries(${KERNEL_TARGET} kernel_heap gcc)
 add_dependencies(${KERNEL_TARGET} kernel_heap)
 
 add_custom_command(

+ 1 - 2
Kernel/KSyms.cpp

@@ -4,7 +4,6 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
-#include <AK/Demangle.h>
 #include <AK/TemporaryChange.h>
 #include <Kernel/Arch/x86/SmapDisabler.h>
 #include <Kernel/FileSystem/FileDescription.h>
@@ -148,7 +147,7 @@ NEVER_INLINE static void dump_backtrace_impl(FlatPtr base_pointer, bool use_ksym
         if (symbol.symbol->address == g_highest_kernel_symbol_address && offset > 4096)
             dbgln("{:p}", symbol.address);
         else
-            dbgln("{:p}  {} +0x{:x}", symbol.address, demangle(symbol.symbol->name), offset);
+            dbgln("{:p}  {} +0x{:x}", symbol.address, symbol.symbol->name, offset);
     }
 }
 

+ 1 - 2
Kernel/Process.cpp

@@ -4,7 +4,6 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
-#include <AK/Demangle.h>
 #include <AK/StdLibExtras.h>
 #include <AK/StringBuilder.h>
 #include <AK/Time.h>
@@ -362,7 +361,7 @@ void Process::crash(int signal, FlatPtr ip, bool out_of_memory)
     } else {
         if (ip >= KERNEL_BASE && g_kernel_symbols_available) {
             auto* symbol = symbolicate_kernel_address(ip);
-            dbgln("\033[31;1m{:p}  {} +{}\033[0m\n", ip, (symbol ? demangle(symbol->name) : "(k?)"), (symbol ? ip - symbol->address : 0));
+            dbgln("\033[31;1m{:p}  {} +{}\033[0m\n", ip, (symbol ? symbol->name : "(k?)"), (symbol ? ip - symbol->address : 0));
         } else {
             dbgln("\033[31;1m{:p}  (?)\033[0m\n", ip);
         }

+ 1 - 2
Kernel/Thread.cpp

@@ -4,7 +4,6 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
-#include <AK/Demangle.h>
 #include <AK/ScopeGuard.h>
 #include <AK/StringBuilder.h>
 #include <AK/Time.h>
@@ -1051,7 +1050,7 @@ static bool symbolicate(RecognizedSymbol const& symbol, Process& process, String
     if (symbol.symbol->address == g_highest_kernel_symbol_address && offset > 4096) {
         builder.appendff("{:p}\n", (void*)(mask_kernel_addresses ? 0xdeadc0de : symbol.address));
     } else {
-        builder.appendff("{:p}  {} + 0x{:x}\n", (void*)(mask_kernel_addresses ? 0xdeadc0de : symbol.address), demangle(symbol.symbol->name), offset);
+        builder.appendff("{:p}  {} + 0x{:x}\n", (void*)(mask_kernel_addresses ? 0xdeadc0de : symbol.address), symbol.symbol->name, offset);
     }
     return true;
 }

+ 1 - 1
Kernel/mkmap.sh

@@ -7,5 +7,5 @@ else
 fi
 nm -n $kernel_binary | awk '{ if ($2 != "a") print; }' | uniq > "$tmp"
 printf "%08x\n" "$(wc -l "$tmp" | cut -f1 -d' ')" > kernel.map
-cat "$tmp" >> kernel.map
+c++filt < "$tmp" >> kernel.map
 rm -f "$tmp"

+ 4 - 0
Userland/Libraries/LibELF/Image.cpp

@@ -289,6 +289,7 @@ StringView Image::Symbol::raw_data() const
     return { section.raw_data() + (value() - section.address()), size() };
 }
 
+#ifndef KERNEL
 Optional<Image::Symbol> Image::find_demangled_function(const StringView& name) const
 {
     Optional<Image::Symbol> found;
@@ -309,6 +310,7 @@ Optional<Image::Symbol> Image::find_demangled_function(const StringView& name) c
     });
     return found;
 }
+#endif
 
 Image::SortedSymbol* Image::find_sorted_symbol(FlatPtr address) const
 {
@@ -355,6 +357,7 @@ NEVER_INLINE void Image::sort_symbols() const
     });
 }
 
+#ifndef KERNEL
 String Image::symbolicate(u32 address, u32* out_offset) const
 {
     auto symbol_count = this->symbol_count();
@@ -381,5 +384,6 @@ String Image::symbolicate(u32 address, u32* out_offset) const
     }
     return String::formatted("{} +{:#x}", demangled_name, address - symbol->address);
 }
+#endif
 
 } // end namespace ELF

+ 3 - 2
Userland/Libraries/LibELF/Image.h

@@ -227,10 +227,11 @@ public:
     FlatPtr base_address() const { return (FlatPtr)m_buffer; }
     size_t size() const { return m_size; }
 
-    Optional<Symbol> find_demangled_function(const StringView& name) const;
-
     bool has_symbols() const { return symbol_count(); }
+#ifndef KERNEL
+    Optional<Symbol> find_demangled_function(const StringView& name) const;
     String symbolicate(u32 address, u32* offset = nullptr) const;
+#endif
     Optional<Image::Symbol> find_symbol(u32 address, u32* offset = nullptr) const;
 
 private: