| #!/usr/bin/env python3 |
| # |
| # Copyright (c) 2017 Linaro Limited |
| # |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| import sys |
| import argparse |
| import pprint |
| import os |
| import struct |
| from distutils.version import LooseVersion |
| |
| import elftools |
| from elftools.elf.elffile import ELFFile |
| from elftools.dwarf import descriptions |
| from elftools.elf.sections import SymbolTableSection |
| |
| if LooseVersion(elftools.__version__) < LooseVersion('0.24'): |
| sys.stderr.write("pyelftools is out of date, need version 0.24 or later\n") |
| sys.exit(1) |
| |
| |
| def get_symbols(obj): |
| for section in obj.iter_sections(): |
| if isinstance(section, SymbolTableSection): |
| return {sym.name: sym.entry.st_value |
| for sym in section.iter_symbols()} |
| |
| raise LookupError("Could not find symbol table") |
| |
| |
| def parse_args(): |
| global args |
| |
| parser = argparse.ArgumentParser( |
| description=__doc__, |
| formatter_class=argparse.RawDescriptionHelpFormatter) |
| |
| parser.add_argument( |
| "-k", "--kernel", required=True, |
| help="Input zephyr ELF binary") |
| parser.add_argument( |
| "-o", "--output", required=True, |
| help="Output linker file") |
| parser.add_argument( |
| "-v", "--verbose", action="store_true", |
| help="Print extra debugging information") |
| args = parser.parse_args() |
| |
| |
| def main(): |
| parse_args() |
| |
| bit_len = None |
| |
| with open(args.kernel, "rb") as fp: |
| elf = ELFFile(fp) |
| args.little_endian = elf.little_endian |
| syms = get_symbols(elf) |
| |
| app_ram_size = syms['__app_last_address_used'] - \ |
| syms['__app_ram_start'] |
| bit_len = app_ram_size.bit_length() |
| |
| if bit_len: |
| align_size = 1 << bit_len |
| else: |
| align_size = 32 |
| |
| with open(args.output, "w") as fp: |
| fp.write("/***********************************************\n") |
| fp.write(" * Generated file, do not modify\n") |
| fp.write(" **********************************************/\n") |
| fp.write("_app_data_align = " + str(align_size) + ";\n") |
| fp.write(". = ALIGN(_app_data_align);\n") |
| |
| if __name__ == "__main__": |
| main() |