Add a function which checks whether data is in ELF format or not. This will be used by binman to check this for entries.
Signed-off-by: Simon Glass <s...@chromium.org> --- (no changes since v1) tools/binman/elf.py | 16 ++++++++++++++++ tools/binman/elf_test.py | 10 ++++++++++ 2 files changed, 26 insertions(+) diff --git a/tools/binman/elf.py b/tools/binman/elf.py index fe50bf542c3..2f4b7d1a08e 100644 --- a/tools/binman/elf.py +++ b/tools/binman/elf.py @@ -21,6 +21,7 @@ ELF_TOOLS = True try: from elftools.elf.elffile import ELFFile from elftools.elf.elffile import ELFError + import elftools from elftools.elf.sections import SymbolTableSection except: # pragma: no cover ELF_TOOLS = False @@ -518,3 +519,18 @@ def read_loadable_segments(data): rend = start + segment['p_filesz'] segments.append((i, segment['p_paddr'], data[start:rend])) return segments, entry + +def is_valid(data): + """Check if some binary data is a valid ELF file + + Args: + data (bytes): Bytes to check + + Returns: + bool: True if a valid Elf file, False if not + """ + try: + DecodeElf(data, 0) + return True + except elftools.common.exceptions.ELFError: + return False diff --git a/tools/binman/elf_test.py b/tools/binman/elf_test.py index 75b867c2be8..082a3e1d28c 100644 --- a/tools/binman/elf_test.py +++ b/tools/binman/elf_test.py @@ -348,6 +348,16 @@ class TestElf(unittest.TestCase): finally: elf.ELF_TOOLS = old_val + def test_is_valid(self): + """Test is_valid()""" + self.assertEqual(False, elf.is_valid(b'')) + self.assertEqual(False, elf.is_valid(b'1234')) + + fname = self.ElfTestFile('elf_sections') + data = tools.read_file(fname) + self.assertEqual(True, elf.is_valid(data)) + self.assertEqual(False, elf.is_valid(data[4:])) + if __name__ == '__main__': unittest.main() -- 2.39.0.314.g84b9a713c41-goog