adds script for annotating memory addrs to riscof memory dumps
This commit is contained in:
		
							
								
								
									
										75
									
								
								scripts/annotate_addr_to_signature.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								scripts/annotate_addr_to_signature.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | |||||||
|  | import argparse | ||||||
|  | import os | ||||||
|  | import subprocess | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_address_from_objdump(elf_file, symbol): | ||||||
|  |     result = subprocess.run( | ||||||
|  |         ["riscv64-unknown-elf-objdump", "-t", elf_file], capture_output=True, text=True | ||||||
|  |     ) | ||||||
|  |     for line in result.stdout.splitlines(): | ||||||
|  |         if symbol in line: | ||||||
|  |             return int(line.split()[0], 16) | ||||||
|  |     return None | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def annotate_dump(signature_file, elf_file): | ||||||
|  |     begin_signature = get_address_from_objdump(elf_file, "begin_signature") | ||||||
|  |     end_signature = get_address_from_objdump(elf_file, "end_signature") | ||||||
|  |  | ||||||
|  |     if begin_signature is None or end_signature is None: | ||||||
|  |         print(f"Symbols not found in {elf_file}") | ||||||
|  |         return | ||||||
|  |  | ||||||
|  |     address = begin_signature | ||||||
|  |     annotated_lines = [] | ||||||
|  |  | ||||||
|  |     with open(signature_file, "r") as sig_file: | ||||||
|  |         for line in sig_file: | ||||||
|  |             annotated_lines.append(f"{hex(address)}: {line.strip()}") | ||||||
|  |             address += 4 | ||||||
|  |  | ||||||
|  |     output_file = signature_file + ".annotated" | ||||||
|  |     with open(output_file, "w") as out_file: | ||||||
|  |         out_file.write("\n".join(annotated_lines)) | ||||||
|  |     print(f"Annotated file created: {output_file}") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def process_directory(root_dir): | ||||||
|  |     for subdir, _, files in os.walk(root_dir): | ||||||
|  |         elf_file = None | ||||||
|  |         signature_file = None | ||||||
|  |  | ||||||
|  |         for file in files: | ||||||
|  |             if file.endswith(".elf"): | ||||||
|  |                 elf_file = os.path.join(subdir, file) | ||||||
|  |             elif file.endswith(".signature"): | ||||||
|  |                 signature_file = os.path.join(subdir, file) | ||||||
|  |  | ||||||
|  |         if elf_file and signature_file: | ||||||
|  |             annotate_dump(signature_file, elf_file) | ||||||
|  |         elif signature_file: | ||||||
|  |             print(f"No ELF file found for {signature_file}") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def main(): | ||||||
|  |     parser = argparse.ArgumentParser( | ||||||
|  |         description=""" | ||||||
|  |         Annotate memory dumps with addresses. Parses all subdirectories from the given root. | ||||||
|  |         Expects a .signature with a corresponding .elf in the same directory. | ||||||
|  |         Designed to annotate riscof signatures.""" | ||||||
|  |     ) | ||||||
|  |     parser.add_argument( | ||||||
|  |         "root_dir", type=str, help="Root directory to search for .signature files" | ||||||
|  |     ) | ||||||
|  |     args = parser.parse_args() | ||||||
|  |  | ||||||
|  |     if not os.path.isdir(args.root_dir): | ||||||
|  |         print("Invalid root directory") | ||||||
|  |         return | ||||||
|  |  | ||||||
|  |     process_directory(args.root_dir) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     main() | ||||||
		Reference in New Issue
	
	Block a user