blob: aaaa1f4f5918523642741ce908bdab73f532ef6b [file] [log] [blame]
Andy Grosse8860fe2018-02-01 01:12:32 -06001#!/usr/bin/env python3
2#
3# Copyright (c) 2017 Linaro Limited
4#
5# SPDX-License-Identifier: Apache-2.0
6
7import sys
8import argparse
9import pprint
10import os
11import struct
12from distutils.version import LooseVersion
13
14import elftools
15from elftools.elf.elffile import ELFFile
16from elftools.dwarf import descriptions
17from elftools.elf.sections import SymbolTableSection
18
19if LooseVersion(elftools.__version__) < LooseVersion('0.24'):
20 sys.stderr.write("pyelftools is out of date, need version 0.24 or later\n")
21 sys.exit(1)
22
23
24def get_symbols(obj):
25 for section in obj.iter_sections():
26 if isinstance(section, SymbolTableSection):
27 return {sym.name: sym.entry.st_value
28 for sym in section.iter_symbols()}
29
30 raise LookupError("Could not find symbol table")
31
32
33def parse_args():
34 global args
35
36 parser = argparse.ArgumentParser(
37 description=__doc__,
38 formatter_class=argparse.RawDescriptionHelpFormatter)
39
40 parser.add_argument(
41 "-k", "--kernel", required=True,
42 help="Input zephyr ELF binary")
43 parser.add_argument(
44 "-o", "--output", required=True,
45 help="Output linker file")
46 parser.add_argument(
47 "-v", "--verbose", action="store_true",
48 help="Print extra debugging information")
49 args = parser.parse_args()
50
51
52def main():
53 parse_args()
54
55 bit_len = None
56
57 with open(args.kernel, "rb") as fp:
58 elf = ELFFile(fp)
59 args.little_endian = elf.little_endian
60 syms = get_symbols(elf)
61
62 app_ram_size = syms['__app_last_address_used'] - \
63 syms['__app_ram_start']
64 bit_len = app_ram_size.bit_length()
65
66 if bit_len:
67 align_size = 1 << bit_len
68 else:
69 align_size = 32
70
71 with open(args.output, "w") as fp:
72 fp.write("/***********************************************\n")
73 fp.write(" * Generated file, do not modify\n")
74 fp.write(" **********************************************/\n")
75 fp.write("_app_data_align = " + str(align_size) + ";\n")
76 fp.write(". = ALIGN(_app_data_align);\n")
77
78if __name__ == "__main__":
79 main()