mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 16:32:45 +00:00 
			
		
		
		
	LibELF: Refactor coredump notes section structures
This commit is contained in:
		
							parent
							
								
									f12e13e81c
								
							
						
					
					
						commit
						349c6780ce
					
				
					 3 changed files with 17 additions and 12 deletions
				
			
		|  | @ -198,14 +198,12 @@ ByteBuffer CoreDump::create_notes_threads_data() const | ||||||
| 
 | 
 | ||||||
|     m_process.for_each_thread([&](Thread& thread) { |     m_process.for_each_thread([&](Thread& thread) { | ||||||
|         ByteBuffer entry_buff; |         ByteBuffer entry_buff; | ||||||
|         ELF::Core::NotesEntry entry {}; |  | ||||||
|         entry.type = ELF::Core::NotesEntry::Type::ThreadInfo; |  | ||||||
| 
 | 
 | ||||||
|         ELF::Core::ThreadInfo info {}; |         ELF::Core::ThreadInfo info {}; | ||||||
|  |         info.header.type = ELF::Core::NotesEntryHeader::Type::ThreadInfo; | ||||||
|         info.tid = thread.tid().value(); |         info.tid = thread.tid().value(); | ||||||
|         Ptrace::copy_kernel_registers_into_ptrace_registers(info.regs, thread.get_register_dump_from_stack()); |         Ptrace::copy_kernel_registers_into_ptrace_registers(info.regs, thread.get_register_dump_from_stack()); | ||||||
| 
 | 
 | ||||||
|         entry_buff.append((void*)&entry, sizeof(entry)); |  | ||||||
|         entry_buff.append((void*)&info, sizeof(info)); |         entry_buff.append((void*)&info, sizeof(info)); | ||||||
| 
 | 
 | ||||||
|         threads_data += entry_buff; |         threads_data += entry_buff; | ||||||
|  | @ -219,16 +217,15 @@ ByteBuffer CoreDump::create_notes_regions_data() const | ||||||
| { | { | ||||||
|     ByteBuffer regions_data; |     ByteBuffer regions_data; | ||||||
|     for (size_t region_index = 0; region_index < m_process.m_regions.size(); ++region_index) { |     for (size_t region_index = 0; region_index < m_process.m_regions.size(); ++region_index) { | ||||||
|         ELF::Core::NotesEntry entry {}; |  | ||||||
|         entry.type = ELF::Core::NotesEntry::Type::MemoryRegionInfo; |  | ||||||
| 
 | 
 | ||||||
|         ByteBuffer memory_region_info_buffer; |         ByteBuffer memory_region_info_buffer; | ||||||
|         ELF::Core::MemoryRegionInfo info {}; |         ELF::Core::MemoryRegionInfo info {}; | ||||||
|  |         info.header.type = ELF::Core::NotesEntryHeader::Type::MemoryRegionInfo; | ||||||
| 
 | 
 | ||||||
|         auto& region = m_process.m_regions[region_index]; |         auto& region = m_process.m_regions[region_index]; | ||||||
|         info.region_start = reinterpret_cast<uint32_t>(region.vaddr().as_ptr()); |         info.region_start = reinterpret_cast<uint32_t>(region.vaddr().as_ptr()); | ||||||
|         info.region_end = reinterpret_cast<uint32_t>(region.vaddr().as_ptr() + region.size()); |         info.region_end = reinterpret_cast<uint32_t>(region.vaddr().as_ptr() + region.size()); | ||||||
|         info.region_start = info.program_header_index; |         info.program_header_index = region_index; | ||||||
| 
 | 
 | ||||||
|         memory_region_info_buffer.append((void*)&info, sizeof(info)); |         memory_region_info_buffer.append((void*)&info, sizeof(info)); | ||||||
| 
 | 
 | ||||||
|  | @ -237,7 +234,6 @@ ByteBuffer CoreDump::create_notes_regions_data() const | ||||||
|             name = String::empty(); |             name = String::empty(); | ||||||
|         memory_region_info_buffer.append(name.characters(), name.length() + 1); |         memory_region_info_buffer.append(name.characters(), name.length() + 1); | ||||||
| 
 | 
 | ||||||
|         regions_data.append((void*)&entry, sizeof(entry)); |  | ||||||
|         regions_data += memory_region_info_buffer; |         regions_data += memory_region_info_buffer; | ||||||
|     } |     } | ||||||
|     return regions_data; |     return regions_data; | ||||||
|  | @ -250,8 +246,8 @@ ByteBuffer CoreDump::create_notes_segment_data() const | ||||||
|     notes_buffer += create_notes_threads_data(); |     notes_buffer += create_notes_threads_data(); | ||||||
|     notes_buffer += create_notes_regions_data(); |     notes_buffer += create_notes_regions_data(); | ||||||
| 
 | 
 | ||||||
|     ELF::Core::NotesEntry null_entry {}; |     ELF::Core::NotesEntryHeader null_entry {}; | ||||||
|     null_entry.type = ELF::Core::NotesEntry::Type::Null; |     null_entry.type = ELF::Core::NotesEntryHeader::Type::Null; | ||||||
|     notes_buffer.append(&null_entry, sizeof(null_entry)); |     notes_buffer.append(&null_entry, sizeof(null_entry)); | ||||||
| 
 | 
 | ||||||
|     return notes_buffer; |     return notes_buffer; | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
|  | 
 | ||||||
| #include <AK/NonnullRefPtr.h> | #include <AK/NonnullRefPtr.h> | ||||||
| #include <AK/OwnPtr.h> | #include <AK/OwnPtr.h> | ||||||
| #include <Kernel/Forward.h> | #include <Kernel/Forward.h> | ||||||
|  |  | ||||||
|  | @ -25,12 +25,13 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
|  | 
 | ||||||
| #include <AK/Types.h> | #include <AK/Types.h> | ||||||
| #include <LibC/sys/arch/i386/regs.h> | #include <LibC/sys/arch/i386/regs.h> | ||||||
| 
 | 
 | ||||||
| namespace ELF::Core { | namespace ELF::Core { | ||||||
| 
 | 
 | ||||||
| struct [[gnu::packed]] NotesEntry | struct [[gnu::packed]] NotesEntryHeader | ||||||
| { | { | ||||||
|     enum Type : u8 { |     enum Type : u8 { | ||||||
|         Null = 0, // Terminates segment
 |         Null = 0, // Terminates segment
 | ||||||
|  | @ -38,21 +39,28 @@ struct [[gnu::packed]] NotesEntry | ||||||
|         MemoryRegionInfo, |         MemoryRegionInfo, | ||||||
|     }; |     }; | ||||||
|     Type type; |     Type type; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct [[gnu::packed]] NotesEntry | ||||||
|  | { | ||||||
|  |     NotesEntryHeader header; | ||||||
|     char data[]; |     char data[]; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct [[gnu::packed]] ThreadInfo | struct [[gnu::packed]] ThreadInfo | ||||||
| { | { | ||||||
|  |     NotesEntryHeader header; | ||||||
|     int tid; |     int tid; | ||||||
|     PtraceRegisters regs; |     PtraceRegisters regs; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct [[gnu::packed]] MemoryRegionInfo | struct [[gnu::packed]] MemoryRegionInfo | ||||||
| { | { | ||||||
|     uint32_t region_start {}; |     NotesEntryHeader header; | ||||||
|  |     uint32_t region_start; | ||||||
|     uint32_t region_end; |     uint32_t region_end; | ||||||
|     uint16_t program_header_index; |     uint16_t program_header_index; | ||||||
|     char file_name[]; |     char region_name[]; // Null terminated
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Itamar
						Itamar