xref: /optee_os/scripts/gen_tee_bin.py (revision 55c1b9479857869599b19f3442c5130f6d14e6ae)
13c51966bSJens Wiklander#!/usr/bin/env python3
23c51966bSJens Wiklander# SPDX-License-Identifier: BSD-2-Clause
33c51966bSJens Wiklander#
43c51966bSJens Wiklander# Copyright (c) 2019, Linaro Limited
53c51966bSJens Wiklander#
63c51966bSJens Wiklander
73c51966bSJens Wiklanderfrom __future__ import print_function
83c51966bSJens Wiklanderfrom __future__ import division
93c51966bSJens Wiklander
103c51966bSJens Wiklanderimport argparse
113c51966bSJens Wiklanderimport sys
123c51966bSJens Wiklanderimport struct
133c51966bSJens Wiklanderimport re
143c51966bSJens Wiklanderimport hashlib
153c51966bSJens Wiklandertry:
163c51966bSJens Wiklander    from elftools.elf.elffile import ELFFile
173c51966bSJens Wiklander    from elftools.elf.constants import SH_FLAGS
185966660cSJens Wiklander    from elftools.elf.enums import ENUM_RELOC_TYPE_ARM
195966660cSJens Wiklander    from elftools.elf.enums import ENUM_RELOC_TYPE_AARCH64
203c51966bSJens Wiklander    from elftools.elf.sections import SymbolTableSection
215966660cSJens Wiklander    from elftools.elf.relocation import RelocationSection
223c51966bSJens Wiklander
233c51966bSJens Wiklanderexcept ImportError:
243c51966bSJens Wiklander    print("""
253c51966bSJens Wiklander***
263c51966bSJens WiklanderCan't find elftools module. Probably it is not installed on your system.
273c51966bSJens WiklanderYou can install this module with
283c51966bSJens Wiklander
293c51966bSJens Wiklander$ apt install python3-pyelftools
303c51966bSJens Wiklander
313c51966bSJens Wiklanderif you are using Ubuntu. Or try to search for "pyelftools" or "elftools" in
323c51966bSJens Wiklanderyour package manager if you are using some other distribution.
333c51966bSJens Wiklander***
343c51966bSJens Wiklander""")
353c51966bSJens Wiklander    raise
363c51966bSJens Wiklander
373c51966bSJens Wiklandersmall_page_size = 4 * 1024
383c51966bSJens Wiklanderelffile_symbols = None
393c51966bSJens Wiklandertee_pageable_bin = None
403c51966bSJens Wiklandertee_pager_bin = None
415dd1570aSJens Wiklandertee_embdata_bin = None
423c51966bSJens Wiklander
433c51966bSJens Wiklander
443c51966bSJens Wiklanderdef eprint(*args, **kwargs):
453c51966bSJens Wiklander    print(*args, file=sys.stderr, **kwargs)
463c51966bSJens Wiklander
473c51966bSJens Wiklander
485dd1570aSJens Wiklanderdef round_up(n, m):
495dd1570aSJens Wiklander    if n == 0:
505dd1570aSJens Wiklander        return 0
515dd1570aSJens Wiklander    else:
525dd1570aSJens Wiklander        return (((n - 1) // m) + 1) * m
535dd1570aSJens Wiklander
545dd1570aSJens Wiklander
555dd1570aSJens Wiklanderdef get_arch_id(elffile):
565dd1570aSJens Wiklander    e_machine = elffile.header['e_machine']
575dd1570aSJens Wiklander    if e_machine == 'EM_ARM':
585dd1570aSJens Wiklander        return 0
595dd1570aSJens Wiklander    if e_machine == 'EM_AARCH64':
605dd1570aSJens Wiklander        return 1
615dd1570aSJens Wiklander    eprint('Unknown e_machine "%s"' % e_machine)
625dd1570aSJens Wiklander    sys.exit(1)
635dd1570aSJens Wiklander
645dd1570aSJens Wiklander
652338a971SJerome Forissierdef get_name(obj):
662338a971SJerome Forissier    # Symbol or section .name might be a byte array or a string, we want a
672338a971SJerome Forissier    # string
682338a971SJerome Forissier    try:
692338a971SJerome Forissier        name = obj.name.decode()
702338a971SJerome Forissier    except (UnicodeDecodeError, AttributeError):
712338a971SJerome Forissier        name = obj.name
722338a971SJerome Forissier    return name
732338a971SJerome Forissier
742338a971SJerome Forissier
753c51966bSJens Wiklanderdef get_symbol(elffile, name):
763c51966bSJens Wiklander    global elffile_symbols
77f77987aeSJens Wiklander    global lsyms_def
783c51966bSJens Wiklander    if elffile_symbols is None:
793c51966bSJens Wiklander        elffile_symbols = dict()
80f77987aeSJens Wiklander        lsyms_def = dict()
813c51966bSJens Wiklander        symbol_tables = [s for s in elffile.iter_sections()
823c51966bSJens Wiklander                         if isinstance(s, SymbolTableSection)]
833c51966bSJens Wiklander        for section in symbol_tables:
843c51966bSJens Wiklander            for symbol in section.iter_symbols():
852338a971SJerome Forissier                symbol_name = get_name(symbol)
863c51966bSJens Wiklander                if symbol['st_info']['bind'] == 'STB_GLOBAL':
872338a971SJerome Forissier                    elffile_symbols[symbol_name] = symbol
88f77987aeSJens Wiklander                elif symbol['st_info']['bind'] == 'STB_LOCAL':
892338a971SJerome Forissier                    if symbol_name not in elffile_symbols.keys():
902338a971SJerome Forissier                        elffile_symbols[symbol_name] = symbol
912338a971SJerome Forissier                        if symbol_name not in lsyms_def.keys():
922338a971SJerome Forissier                            lsyms_def[symbol_name] = 1
93f77987aeSJens Wiklander                        else:
942338a971SJerome Forissier                            lsyms_def[symbol_name] += 1
953c51966bSJens Wiklander
96f77987aeSJens Wiklander    if name in lsyms_def.keys() and lsyms_def[name] > 1:
97f77987aeSJens Wiklander        eprint("Multiple definitions of local symbol %s" % name)
98f77987aeSJens Wiklander        sys.exit(1)
99f77987aeSJens Wiklander    if name not in elffile_symbols.keys():
1003c51966bSJens Wiklander        eprint("Cannot find symbol %s" % name)
1013c51966bSJens Wiklander        sys.exit(1)
1023c51966bSJens Wiklander
103f77987aeSJens Wiklander    return elffile_symbols[name]
104f77987aeSJens Wiklander
1053c51966bSJens Wiklander
1065dd1570aSJens Wiklanderdef get_sections(elffile, pad_to, dump_names):
1073c51966bSJens Wiklander    last_end = 0
1083c51966bSJens Wiklander    bin_data = bytearray()
1093c51966bSJens Wiklander
1103c51966bSJens Wiklander    for section in elffile.iter_sections():
1112338a971SJerome Forissier        section_name = get_name(section)
1123c51966bSJens Wiklander        if (section['sh_type'] == 'SHT_NOBITS' or
1133c51966bSJens Wiklander                not (section['sh_flags'] & SH_FLAGS.SHF_ALLOC) or
1142338a971SJerome Forissier                not dump_names.match(section_name)):
1153c51966bSJens Wiklander            continue
1163c51966bSJens Wiklander
1173c51966bSJens Wiklander        if last_end == 0:
1183c51966bSJens Wiklander            bin_data = section.data()
1193c51966bSJens Wiklander        else:
1203c51966bSJens Wiklander            if section['sh_addr'] > last_end:
1213c51966bSJens Wiklander                bin_data += bytearray(section['sh_addr'] - last_end)
1223c51966bSJens Wiklander            bin_data += section.data()
1233c51966bSJens Wiklander
1243c51966bSJens Wiklander        last_end = section['sh_addr'] + section['sh_size']
1253c51966bSJens Wiklander
1263c51966bSJens Wiklander    if pad_to > last_end:
1273c51966bSJens Wiklander        bin_data += bytearray(pad_to - last_end)
1283c51966bSJens Wiklander        last_end = pad_to
1293c51966bSJens Wiklander
1303c51966bSJens Wiklander    return bin_data
1313c51966bSJens Wiklander
1323c51966bSJens Wiklander
1333c51966bSJens Wiklanderdef get_pageable_bin(elffile):
1343c51966bSJens Wiklander    global tee_pageable_bin
1353c51966bSJens Wiklander    if tee_pageable_bin is None:
1363c51966bSJens Wiklander        pad_to = 0
1373c51966bSJens Wiklander        dump_names = re.compile(r'^\..*_(pageable|init)$')
1385dd1570aSJens Wiklander        tee_pageable_bin = get_sections(elffile, pad_to, dump_names)
1393c51966bSJens Wiklander    return tee_pageable_bin
1403c51966bSJens Wiklander
1413c51966bSJens Wiklander
1423c51966bSJens Wiklanderdef get_pager_bin(elffile):
1433c51966bSJens Wiklander    global tee_pager_bin
1443c51966bSJens Wiklander    if tee_pager_bin is None:
1453c51966bSJens Wiklander        pad_to = get_symbol(elffile, '__data_end')['st_value']
1465dd1570aSJens Wiklander        dump_names = re.compile(
1475966660cSJens Wiklander            r'^\.(text|rodata|got|data|ARM\.exidx|ARM\.extab)$')
1485dd1570aSJens Wiklander        tee_pager_bin = get_sections(elffile, pad_to, dump_names)
1493c51966bSJens Wiklander
1503c51966bSJens Wiklander    return tee_pager_bin
1513c51966bSJens Wiklander
1523c51966bSJens Wiklander
1535966660cSJens Wiklanderdef get_reloc_bin(elffile):
1545966660cSJens Wiklander    if get_arch_id(elffile) == 0:
1555966660cSJens Wiklander        exp_rel_type = ENUM_RELOC_TYPE_ARM['R_ARM_RELATIVE']
1565966660cSJens Wiklander    else:
1575966660cSJens Wiklander        exp_rel_type = ENUM_RELOC_TYPE_AARCH64['R_AARCH64_RELATIVE']
1585966660cSJens Wiklander
1595966660cSJens Wiklander    link_address = get_symbol(elffile, '__text_start')['st_value']
1605966660cSJens Wiklander
1615966660cSJens Wiklander    addrs = []
1625966660cSJens Wiklander    for section in elffile.iter_sections():
1635966660cSJens Wiklander        if not isinstance(section, RelocationSection):
1645966660cSJens Wiklander            continue
1655966660cSJens Wiklander        for rel in section.iter_relocations():
1665966660cSJens Wiklander            if rel['r_info_type'] == 0:
1675966660cSJens Wiklander                continue
1685966660cSJens Wiklander            if rel['r_info_type'] != exp_rel_type:
1695966660cSJens Wiklander                eprint("Unexpected relocation type 0x%x" %
1705966660cSJens Wiklander                       rel['r_info_type'])
1715966660cSJens Wiklander                sys.exit(1)
1725966660cSJens Wiklander            addrs.append(rel['r_offset'] - link_address)
1735966660cSJens Wiklander
1745966660cSJens Wiklander    addrs.sort()
1755966660cSJens Wiklander    data = bytearray()
1765966660cSJens Wiklander    for a in addrs:
1775966660cSJens Wiklander        data += struct.pack('<I', a)
1785966660cSJens Wiklander
1795966660cSJens Wiklander    # Relocations has been reduced to only become the relative type with
1805966660cSJens Wiklander    # addend at the address (r_offset) of relocation, that is, increase by
1815966660cSJens Wiklander    # load_offset. The addresses (r_offset) are also sorted. The format is
1825966660cSJens Wiklander    # then:
1835966660cSJens Wiklander    # uint32_t: relocation #1
1845966660cSJens Wiklander    # uint32_t: relocation #2
1855966660cSJens Wiklander    # ...
1865966660cSJens Wiklander    # uint32_t: relocation #n
1875966660cSJens Wiklander
1885966660cSJens Wiklander    return data
1895966660cSJens Wiklander
1905966660cSJens Wiklander
1915dd1570aSJens Wiklanderdef get_hashes_bin(elffile):
1925dd1570aSJens Wiklander    pageable_bin = get_pageable_bin(elffile)
1935dd1570aSJens Wiklander    if len(pageable_bin) % small_page_size != 0:
1945dd1570aSJens Wiklander        eprint("pageable size not a multiple of 4K: "
1955dd1570aSJens Wiklander               "{}".format(paged_area_size))
1965dd1570aSJens Wiklander        sys.exit(1)
1975dd1570aSJens Wiklander
1985dd1570aSJens Wiklander    data = bytearray()
1995dd1570aSJens Wiklander    for n in range(0, len(pageable_bin), small_page_size):
2005dd1570aSJens Wiklander        page = pageable_bin[n:n + small_page_size]
2015dd1570aSJens Wiklander        data += hashlib.sha256(page).digest()
2025dd1570aSJens Wiklander
2035dd1570aSJens Wiklander    return data
2045dd1570aSJens Wiklander
2055dd1570aSJens Wiklander
2065dd1570aSJens Wiklanderdef get_embdata_bin(elffile):
2075dd1570aSJens Wiklander    global tee_embdata_bin
2085dd1570aSJens Wiklander    if tee_embdata_bin is None:
2095dd1570aSJens Wiklander        hashes_bin = get_hashes_bin(elffile)
2105966660cSJens Wiklander        reloc_bin = get_reloc_bin(elffile)
2115dd1570aSJens Wiklander
2125966660cSJens Wiklander        num_entries = 2
2135dd1570aSJens Wiklander        hash_offs = 2 * 4 + num_entries * (2 * 4)
2145dd1570aSJens Wiklander        hash_pad = round_up(len(hashes_bin), 8) - len(hashes_bin)
2155966660cSJens Wiklander        reloc_offs = hash_offs + len(hashes_bin) + hash_pad
2165966660cSJens Wiklander        reloc_pad = round_up(len(reloc_bin), 8) - len(reloc_bin)
2175966660cSJens Wiklander        total_len = reloc_offs + len(reloc_bin) + reloc_pad
2185dd1570aSJens Wiklander
2195966660cSJens Wiklander        tee_embdata_bin = struct.pack('<IIIIII', total_len, num_entries,
2205966660cSJens Wiklander                                      hash_offs, len(hashes_bin),
2215966660cSJens Wiklander                                      reloc_offs, len(reloc_bin))
2225dd1570aSJens Wiklander        tee_embdata_bin += hashes_bin + bytearray(hash_pad)
2235966660cSJens Wiklander        tee_embdata_bin += reloc_bin + bytearray(reloc_pad)
2245dd1570aSJens Wiklander
2255dd1570aSJens Wiklander    # The embedded data region is designed to be easy to extend when
2265dd1570aSJens Wiklander    # needed, it's formatted as:
2275966660cSJens Wiklander    # +---------------------------------------------------------+
2285dd1570aSJens Wiklander    # | uint32_t: Length of entire area including this field    |
2295966660cSJens Wiklander    # +---------------------------------------------------------+
2305966660cSJens Wiklander    # | uint32_t: Number of entries "2"                         |
2315966660cSJens Wiklander    # +---------------------------------------------------------+
2325dd1570aSJens Wiklander    # | uint32_t: Offset of hashes from beginning of table      |
2335966660cSJens Wiklander    # +---------------------------------------------------------+
2345dd1570aSJens Wiklander    # | uint32_t: Length of hashes                              |
2355966660cSJens Wiklander    # +---------------------------------------------------------+
2365966660cSJens Wiklander    # | uint32_t: Offset of relocations from beginning of table |
2375966660cSJens Wiklander    # +---------------------------------------------------------+
2385966660cSJens Wiklander    # | uint32_t: Length of relocations                         |
2395966660cSJens Wiklander    # +---------------------------------------------------------+
2405dd1570aSJens Wiklander    # | Data of hashes + eventual padding                       |
2415966660cSJens Wiklander    # +---------------------------------------------------------+
2425966660cSJens Wiklander    # | Data of relocations + eventual padding                  |
2435966660cSJens Wiklander    # +---------------------------------------------------------+
2445dd1570aSJens Wiklander
2455dd1570aSJens Wiklander    return tee_embdata_bin
2465dd1570aSJens Wiklander
2475dd1570aSJens Wiklander
2483c51966bSJens Wiklanderdef output_pager_bin(elffile, outf):
2493c51966bSJens Wiklander    outf.write(get_pager_bin(elffile))
2503c51966bSJens Wiklander
2513c51966bSJens Wiklander
2523c51966bSJens Wiklanderdef output_pageable_bin(elffile, outf):
2533c51966bSJens Wiklander    outf.write(get_pageable_bin(elffile))
2543c51966bSJens Wiklander
2553c51966bSJens Wiklander
2563c51966bSJens Wiklanderdef get_init_load_addr(elffile):
2573c51966bSJens Wiklander    init_load_addr = get_symbol(elffile, '_start')['st_value']
2583c51966bSJens Wiklander    init_load_addr_hi = init_load_addr >> 32
2593c51966bSJens Wiklander    init_load_addr_lo = init_load_addr & 0xffffffff
2603c51966bSJens Wiklander    return init_load_addr_hi, init_load_addr_lo
2613c51966bSJens Wiklander
2623c51966bSJens Wiklander
2633c51966bSJens Wiklanderdef output_header_v1(elffile, outf):
2643c51966bSJens Wiklander    arch_id = get_arch_id(elffile)
2653c51966bSJens Wiklander    pager_bin = get_pager_bin(elffile)
2663c51966bSJens Wiklander    pageable_bin = get_pageable_bin(elffile)
2675dd1570aSJens Wiklander    embdata_bin = get_embdata_bin(elffile)
2683c51966bSJens Wiklander    init_load_addr = get_init_load_addr(elffile)
2693c51966bSJens Wiklander    init_bin_size = get_symbol(elffile, '__init_size')['st_value']
2703c51966bSJens Wiklander    pager_bin_size = len(pager_bin)
2713c51966bSJens Wiklander    paged_area_size = len(pageable_bin)
2725dd1570aSJens Wiklander
273*55c1b947SJens Wiklander    init_mem_usage = (get_symbol(elffile, '__get_tee_init_end')['st_value'] -
2745dd1570aSJens Wiklander                      get_symbol(elffile, '__text_start')['st_value'] +
2755dd1570aSJens Wiklander                      len(embdata_bin))
2763c51966bSJens Wiklander
2773c51966bSJens Wiklander    init_size = (pager_bin_size + min(init_bin_size, paged_area_size) +
2785dd1570aSJens Wiklander                 len(embdata_bin))
2793c51966bSJens Wiklander    paged_size = paged_area_size - min(init_bin_size, paged_area_size)
2803c51966bSJens Wiklander
2813c51966bSJens Wiklander    magic = 0x4554504f  # 'OPTE'
2823c51966bSJens Wiklander    version = 1
2833c51966bSJens Wiklander    flags = 0
2843c51966bSJens Wiklander    outf.write(struct.pack('<IBBHIIIII', magic, version, arch_id, flags,
2853c51966bSJens Wiklander                           init_size, init_load_addr[0], init_load_addr[1],
2863c51966bSJens Wiklander                           init_mem_usage, paged_size))
2873c51966bSJens Wiklander    outf.write(pager_bin)
2883c51966bSJens Wiklander    outf.write(pageable_bin[:init_bin_size])
2895dd1570aSJens Wiklander    outf.write(embdata_bin)
2903c51966bSJens Wiklander    outf.write(pageable_bin[init_bin_size:])
2913c51966bSJens Wiklander
2923c51966bSJens Wiklander
2933c51966bSJens Wiklanderdef output_header_v2(elffile, outf):
2943c51966bSJens Wiklander    arch_id = get_arch_id(elffile)
2953c51966bSJens Wiklander    init_load_addr = get_init_load_addr(elffile)
2963c51966bSJens Wiklander    init_bin_size = get_symbol(elffile, '__init_size')['st_value']
2973c51966bSJens Wiklander    pager_bin_size = len(get_pager_bin(elffile))
2983c51966bSJens Wiklander    paged_area_size = len(get_pageable_bin(elffile))
2995dd1570aSJens Wiklander    embdata_bin_size = len(get_embdata_bin(elffile))
3003c51966bSJens Wiklander
3013c51966bSJens Wiklander    init_size = (pager_bin_size + min(init_bin_size, paged_area_size) +
3025dd1570aSJens Wiklander                 embdata_bin_size)
3033c51966bSJens Wiklander    paged_size = paged_area_size - min(init_bin_size, paged_area_size)
3043c51966bSJens Wiklander
3053c51966bSJens Wiklander    magic = 0x4554504f  # 'OPTE'
3063c51966bSJens Wiklander    version = 2
3073c51966bSJens Wiklander    flags = 0
3083c51966bSJens Wiklander    nb_images = 1 if paged_size == 0 else 2
3093c51966bSJens Wiklander    outf.write(struct.pack('<IBBHI', magic, version, arch_id, flags,
3103c51966bSJens Wiklander                           nb_images))
3113c51966bSJens Wiklander    outf.write(struct.pack('<IIII', init_load_addr[0], init_load_addr[1],
3123c51966bSJens Wiklander                           0, init_size))
3133c51966bSJens Wiklander    if nb_images == 2:
3143c51966bSJens Wiklander        outf.write(struct.pack('<IIII', 0xffffffff, 0xffffffff, 1, paged_size))
3153c51966bSJens Wiklander
3163c51966bSJens Wiklander
3173c51966bSJens Wiklanderdef output_pager_v2(elffile, outf):
3183c51966bSJens Wiklander    init_bin_size = get_symbol(elffile, '__init_size')['st_value']
3195dd1570aSJens Wiklander    pager_bin = get_pager_bin(elffile)
3203c51966bSJens Wiklander    pageable_bin = get_pageable_bin(elffile)
3215dd1570aSJens Wiklander    embdata_bin = get_embdata_bin(elffile)
3223c51966bSJens Wiklander
3235dd1570aSJens Wiklander    outf.write(pager_bin)
3243c51966bSJens Wiklander    outf.write(pageable_bin[:init_bin_size])
3255dd1570aSJens Wiklander    outf.write(embdata_bin)
3263c51966bSJens Wiklander
3273c51966bSJens Wiklander
3283c51966bSJens Wiklanderdef output_pageable_v2(elffile, outf):
3293c51966bSJens Wiklander    init_bin_size = get_symbol(elffile, '__init_size')['st_value']
3303c51966bSJens Wiklander    outf.write(get_pageable_bin(elffile)[init_bin_size:])
3313c51966bSJens Wiklander
3323c51966bSJens Wiklander
3333c51966bSJens Wiklanderdef get_args():
3343c51966bSJens Wiklander    parser = argparse.ArgumentParser()
3353c51966bSJens Wiklander
3363c51966bSJens Wiklander    parser.add_argument('--input',
3373c51966bSJens Wiklander                        required=True, type=argparse.FileType('rb'),
3383c51966bSJens Wiklander                        help='The input tee.elf')
3393c51966bSJens Wiklander
3403c51966bSJens Wiklander    parser.add_argument('--out_tee_bin',
3413c51966bSJens Wiklander                        required=False, type=argparse.FileType('wb'),
3423c51966bSJens Wiklander                        help='The output tee.bin')
3433c51966bSJens Wiklander
3443c51966bSJens Wiklander    parser.add_argument('--out_tee_pager_bin',
3453c51966bSJens Wiklander                        required=False, type=argparse.FileType('wb'),
3463c51966bSJens Wiklander                        help='The output tee_pager.bin')
3473c51966bSJens Wiklander
3483c51966bSJens Wiklander    parser.add_argument('--out_tee_pageable_bin',
3493c51966bSJens Wiklander                        required=False, type=argparse.FileType('wb'),
3503c51966bSJens Wiklander                        help='The output tee_pageable.bin')
3513c51966bSJens Wiklander
3523c51966bSJens Wiklander    parser.add_argument('--out_header_v2',
3533c51966bSJens Wiklander                        required=False, type=argparse.FileType('wb'),
3543c51966bSJens Wiklander                        help='The output tee_header_v2.bin')
3553c51966bSJens Wiklander
3563c51966bSJens Wiklander    parser.add_argument('--out_pager_v2',
3573c51966bSJens Wiklander                        required=False, type=argparse.FileType('wb'),
3583c51966bSJens Wiklander                        help='The output tee_pager_v2.bin')
3593c51966bSJens Wiklander
3603c51966bSJens Wiklander    parser.add_argument('--out_pageable_v2',
3613c51966bSJens Wiklander                        required=False, type=argparse.FileType('wb'),
3623c51966bSJens Wiklander                        help='The output tee_pageable_v2.bin')
3633c51966bSJens Wiklander
3643c51966bSJens Wiklander    return parser.parse_args()
3653c51966bSJens Wiklander
3663c51966bSJens Wiklander
3673c51966bSJens Wiklanderdef main():
3683c51966bSJens Wiklander    args = get_args()
3693c51966bSJens Wiklander
3703c51966bSJens Wiklander    elffile = ELFFile(args.input)
3713c51966bSJens Wiklander
3723c51966bSJens Wiklander    if args.out_tee_bin:
3733c51966bSJens Wiklander        output_header_v1(elffile, args.out_tee_bin)
3743c51966bSJens Wiklander
3753c51966bSJens Wiklander    if args.out_tee_pager_bin:
3763c51966bSJens Wiklander        output_pager_bin(elffile, args.out_tee_pager_bin)
3773c51966bSJens Wiklander
3783c51966bSJens Wiklander    if args.out_tee_pageable_bin:
3793c51966bSJens Wiklander        output_pageable_bin(elffile, args.out_tee_pageable_bin)
3803c51966bSJens Wiklander
3813c51966bSJens Wiklander    if args.out_header_v2:
3823c51966bSJens Wiklander        output_header_v2(elffile, args.out_header_v2)
3833c51966bSJens Wiklander
3843c51966bSJens Wiklander    if args.out_pager_v2:
3853c51966bSJens Wiklander        output_pager_v2(elffile, args.out_pager_v2)
3863c51966bSJens Wiklander
3873c51966bSJens Wiklander    if args.out_pageable_v2:
3883c51966bSJens Wiklander        output_pageable_v2(elffile, args.out_pageable_v2)
3893c51966bSJens Wiklander
3903c51966bSJens Wiklander
3913c51966bSJens Wiklanderif __name__ == "__main__":
3923c51966bSJens Wiklander    main()
393