mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 03:32:45 +00:00 
			
		
		
		
	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.
This commit is contained in:
		
							parent
							
								
									8e8a5680d5
								
							
						
					
					
						commit
						67f0c0d5f0
					
				
					 7 changed files with 12 additions and 10 deletions
				
			
		|  | @ -413,7 +413,7 @@ if (ENABLE_KERNEL_LTO) | ||||||
|     check_ipo_supported() |     check_ipo_supported() | ||||||
|     set_property(TARGET ${KERNEL_TARGET} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) |     set_property(TARGET ${KERNEL_TARGET} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) | ||||||
| endif() | 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_dependencies(${KERNEL_TARGET} kernel_heap) | ||||||
| 
 | 
 | ||||||
| add_custom_command( | add_custom_command( | ||||||
|  |  | ||||||
|  | @ -4,7 +4,6 @@ | ||||||
|  * SPDX-License-Identifier: BSD-2-Clause |  * SPDX-License-Identifier: BSD-2-Clause | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include <AK/Demangle.h> |  | ||||||
| #include <AK/TemporaryChange.h> | #include <AK/TemporaryChange.h> | ||||||
| #include <Kernel/Arch/x86/SmapDisabler.h> | #include <Kernel/Arch/x86/SmapDisabler.h> | ||||||
| #include <Kernel/FileSystem/FileDescription.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) |         if (symbol.symbol->address == g_highest_kernel_symbol_address && offset > 4096) | ||||||
|             dbgln("{:p}", symbol.address); |             dbgln("{:p}", symbol.address); | ||||||
|         else |         else | ||||||
|             dbgln("{:p}  {} +0x{:x}", symbol.address, demangle(symbol.symbol->name), offset); |             dbgln("{:p}  {} +0x{:x}", symbol.address, symbol.symbol->name, offset); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -4,7 +4,6 @@ | ||||||
|  * SPDX-License-Identifier: BSD-2-Clause |  * SPDX-License-Identifier: BSD-2-Clause | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include <AK/Demangle.h> |  | ||||||
| #include <AK/StdLibExtras.h> | #include <AK/StdLibExtras.h> | ||||||
| #include <AK/StringBuilder.h> | #include <AK/StringBuilder.h> | ||||||
| #include <AK/Time.h> | #include <AK/Time.h> | ||||||
|  | @ -362,7 +361,7 @@ void Process::crash(int signal, FlatPtr ip, bool out_of_memory) | ||||||
|     } else { |     } else { | ||||||
|         if (ip >= KERNEL_BASE && g_kernel_symbols_available) { |         if (ip >= KERNEL_BASE && g_kernel_symbols_available) { | ||||||
|             auto* symbol = symbolicate_kernel_address(ip); |             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 { |         } else { | ||||||
|             dbgln("\033[31;1m{:p}  (?)\033[0m\n", ip); |             dbgln("\033[31;1m{:p}  (?)\033[0m\n", ip); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -4,7 +4,6 @@ | ||||||
|  * SPDX-License-Identifier: BSD-2-Clause |  * SPDX-License-Identifier: BSD-2-Clause | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include <AK/Demangle.h> |  | ||||||
| #include <AK/ScopeGuard.h> | #include <AK/ScopeGuard.h> | ||||||
| #include <AK/StringBuilder.h> | #include <AK/StringBuilder.h> | ||||||
| #include <AK/Time.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) { |     if (symbol.symbol->address == g_highest_kernel_symbol_address && offset > 4096) { | ||||||
|         builder.appendff("{:p}\n", (void*)(mask_kernel_addresses ? 0xdeadc0de : symbol.address)); |         builder.appendff("{:p}\n", (void*)(mask_kernel_addresses ? 0xdeadc0de : symbol.address)); | ||||||
|     } else { |     } 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; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -7,5 +7,5 @@ else | ||||||
| fi | fi | ||||||
| nm -n $kernel_binary | awk '{ if ($2 != "a") print; }' | uniq > "$tmp" | nm -n $kernel_binary | awk '{ if ($2 != "a") print; }' | uniq > "$tmp" | ||||||
| printf "%08x\n" "$(wc -l "$tmp" | cut -f1 -d' ')" > kernel.map | printf "%08x\n" "$(wc -l "$tmp" | cut -f1 -d' ')" > kernel.map | ||||||
| cat "$tmp" >> kernel.map | c++filt < "$tmp" >> kernel.map | ||||||
| rm -f "$tmp" | rm -f "$tmp" | ||||||
|  |  | ||||||
|  | @ -289,6 +289,7 @@ StringView Image::Symbol::raw_data() const | ||||||
|     return { section.raw_data() + (value() - section.address()), size() }; |     return { section.raw_data() + (value() - section.address()), size() }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifndef KERNEL | ||||||
| Optional<Image::Symbol> Image::find_demangled_function(const StringView& name) const | Optional<Image::Symbol> Image::find_demangled_function(const StringView& name) const | ||||||
| { | { | ||||||
|     Optional<Image::Symbol> found; |     Optional<Image::Symbol> found; | ||||||
|  | @ -309,6 +310,7 @@ Optional<Image::Symbol> Image::find_demangled_function(const StringView& name) c | ||||||
|     }); |     }); | ||||||
|     return found; |     return found; | ||||||
| } | } | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| Image::SortedSymbol* Image::find_sorted_symbol(FlatPtr address) const | 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 | String Image::symbolicate(u32 address, u32* out_offset) const | ||||||
| { | { | ||||||
|     auto symbol_count = this->symbol_count(); |     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); |     return String::formatted("{} +{:#x}", demangled_name, address - symbol->address); | ||||||
| } | } | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| } // end namespace ELF
 | } // end namespace ELF
 | ||||||
|  |  | ||||||
|  | @ -227,10 +227,11 @@ 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 StringView& name) const; |  | ||||||
| 
 |  | ||||||
|     bool has_symbols() const { return symbol_count(); } |     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; |     String symbolicate(u32 address, u32* offset = nullptr) const; | ||||||
|  | #endif | ||||||
|     Optional<Image::Symbol> find_symbol(u32 address, u32* offset = nullptr) const; |     Optional<Image::Symbol> find_symbol(u32 address, u32* offset = nullptr) const; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Gunnar Beutner
						Gunnar Beutner