1 # Copyright (c) 2016 Google, Inc
2 # Written by Simon Glass <sjg@chromium.org>
4 # SPDX-License-Identifier: GPL-2.0+
6 # Handle various things related to ELF images
9 from collections import namedtuple, OrderedDict
17 # This is enabled from control.py
20 Symbol = namedtuple('Symbol', ['section', 'address', 'size', 'weak'])
22 # Used for tests which don't have an ELF file to read
23 ignore_missing_files = False
26 def GetSymbols(fname, patterns):
27 """Get the symbols from an ELF file
30 fname: Filename of the ELF file to read
31 patterns: List of regex patterns to search for, each a string
34 None, if the file does not exist, or Dict:
36 value: Hex value of symbol
38 stdout = command.Output('objdump', '-t', fname, raise_on_error=False)
39 lines = stdout.splitlines()
41 re_syms = re.compile('|'.join(patterns))
47 if not line or not syms_started:
48 if 'SYMBOL TABLE' in line:
50 line = None # Otherwise code coverage complains about 'continue'
52 if re_syms and not re_syms.search(line):
55 space_pos = line.find(' ')
56 value, rest = line[:space_pos], line[space_pos + 1:]
58 parts = rest[7:].split()
59 section, size = parts[:2]
62 syms[name] = Symbol(section, int(value, 16), int(size,16),
66 def GetSymbolAddress(fname, sym_name):
67 """Get a value of a symbol from an ELF file
70 fname: Filename of the ELF file to read
71 patterns: List of regex patterns to search for, each a string
74 Symbol value (as an integer) or None if not found
76 syms = GetSymbols(fname, [sym_name])
77 sym = syms.get(sym_name)