1#!/usr/bin/env python2 2# 3# Copyright (C) 2020 Rockchip Electronics Co., Ltd 4# 5# SPDX-License-Identifier: GPL-2.0+ 6# 7""" 8A script to decode bl31.elf to binary 9""" 10 11import os 12import sys 13import getopt 14import logging 15import struct 16 17def unpack_elf(filename): 18 with open(filename, 'rb') as file: 19 elf = file.read() 20 if elf[0:7] != b'\x7fELF\x02\x01\x01' or elf[18:20] != b'\xb7\x00': 21 raise ValueError("Invalid arm64 ELF file '%s'" % filename) 22 23 e_entry, e_phoff = struct.unpack_from('<2Q', elf, 0x18) 24 e_phentsize, e_phnum = struct.unpack_from('<2H', elf, 0x36) 25 segments = [] 26 27 for index in range(e_phnum): 28 offset = e_phoff + e_phentsize * index 29 p_type, p_flags, p_offset = struct.unpack_from('<LLQ', elf, offset) 30 if p_type == 1: # PT_LOAD 31 p_paddr, p_filesz = struct.unpack_from('<2Q', elf, offset + 0x18) 32 if p_filesz > 0: 33 p_data = elf[p_offset:p_offset + p_filesz] 34 segments.append((index, e_entry, p_paddr, p_data)) 35 return segments 36 37def generate_atf_binary(bl31_file_name): 38 for index, entry, paddr, data in unpack_elf(bl31_file_name): 39 file_name = 'bl31_0x%08x.bin' % paddr 40 with open(file_name, "wb") as atf: 41 atf.write(data) 42 43def main(): 44 bl31_elf="./bl31.elf" 45 generate_atf_binary(bl31_elf); 46 47if __name__ == "__main__": 48 main() 49