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