mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:22: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
	
	 Itamar
						Itamar