--- /dev/null
+Processing file: ./examples/sample_exe64.elf
+ Found a compile unit at offset 0, length 115
+ Top DIE with tag=DW_TAG_compile_unit
+ name=../sysdeps/x86_64/elf/start.S
+ DIE tag=DW_TAG_compile_unit
+ Found a compile unit at offset 119, length 135
+ Top DIE with tag=DW_TAG_compile_unit
+ name=init.c
+ DIE tag=DW_TAG_compile_unit
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_variable
+ DIE tag=DW_TAG_const_type
+ Found a compile unit at offset 258, length 156
+ Top DIE with tag=DW_TAG_compile_unit
+ name=z.c
+ DIE tag=DW_TAG_compile_unit
+ DIE tag=DW_TAG_subprogram
+ DIE tag=DW_TAG_formal_parameter
+ DIE tag=DW_TAG_formal_parameter
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_pointer_type
+ DIE tag=DW_TAG_pointer_type
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_variable
+ Found a compile unit at offset 418, length 300
+ Top DIE with tag=DW_TAG_compile_unit
+ name=elf-init.c
+ DIE tag=DW_TAG_compile_unit
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_typedef
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_subprogram
+ DIE tag=DW_TAG_subprogram
+ DIE tag=DW_TAG_formal_parameter
+ DIE tag=DW_TAG_formal_parameter
+ DIE tag=DW_TAG_formal_parameter
+ DIE tag=DW_TAG_variable
+ DIE tag=DW_TAG_lexical_block
+ DIE tag=DW_TAG_variable
+ DIE tag=DW_TAG_pointer_type
+ DIE tag=DW_TAG_pointer_type
+ DIE tag=DW_TAG_base_type
+ DIE tag=DW_TAG_const_type
+ DIE tag=DW_TAG_array_type
+ DIE tag=DW_TAG_subrange_type
+ DIE tag=DW_TAG_subroutine_type
+ DIE tag=DW_TAG_formal_parameter
+ DIE tag=DW_TAG_formal_parameter
+ DIE tag=DW_TAG_formal_parameter
+ DIE tag=DW_TAG_pointer_type
+ DIE tag=DW_TAG_variable
+ DIE tag=DW_TAG_variable
--- /dev/null
+Processing file: ./examples/sample_exe64.elf
+ Found a compile unit at offset 0, length 115
+ Found a compile unit at offset 119, length 135
+ Found a compile unit at offset 258, length 156
+ DIE DW_TAG_subprogram. attr DW_AT_frame_base.
+ LocationEntry(begin_offset=0, end_offset=1, loc_expr=[119, 8]) <<(DW_OP_breg7 (rsp): 8)>>
+ LocationEntry(begin_offset=1, end_offset=4, loc_expr=[119, 16]) <<(DW_OP_breg7 (rsp): 16)>>
+ LocationEntry(begin_offset=4, end_offset=43, loc_expr=[118, 16]) <<(DW_OP_breg6 (rbp): 16)>>
+ Found a compile unit at offset 418, length 300
+ DIE DW_TAG_subprogram. attr DW_AT_frame_base.
+ LocationEntry(begin_offset=16, end_offset=64, loc_expr=[119, 8]) <<(DW_OP_breg7 (rsp): 8)>>
+ LocationEntry(begin_offset=64, end_offset=153, loc_expr=[119, 192, 0]) <<(DW_OP_breg7 (rsp): 64)>>
+ DIE DW_TAG_formal_parameter. attr DW_AT_location.
+ LocationEntry(begin_offset=16, end_offset=85, loc_expr=[85]) <<(DW_OP_reg5 (rdi))>>
+ LocationEntry(begin_offset=85, end_offset=143, loc_expr=[94]) <<(DW_OP_reg14 (r14))>>
+ DIE DW_TAG_formal_parameter. attr DW_AT_location.
+ LocationEntry(begin_offset=16, end_offset=85, loc_expr=[84]) <<(DW_OP_reg4 (rsi))>>
+ LocationEntry(begin_offset=85, end_offset=138, loc_expr=[93]) <<(DW_OP_reg13 (r13))>>
+ DIE DW_TAG_formal_parameter. attr DW_AT_location.
+ LocationEntry(begin_offset=16, end_offset=85, loc_expr=[81]) <<(DW_OP_reg1 (rdx))>>
+ LocationEntry(begin_offset=85, end_offset=133, loc_expr=[92]) <<(DW_OP_reg12 (r12))>>
+ DIE DW_TAG_variable. attr DW_AT_location.
+ LocationEntry(begin_offset=92, end_offset=123, loc_expr=[83]) <<(DW_OP_reg3 (rbx))>>
--- /dev/null
+Processing file: ./examples/sample_exe64.elf
+Low level API...
+ 42 sections
+ Section name: 1, type: SHT_SYMTAB
+High level API...
+ 42 sections
+ Section name: .symtab, type: SHT_SYMTAB
+ It's a symbol section with 80 symbols
+ The name of symbol #60 is: __init_array_start
--- /dev/null
+Processing file: ./examples/sample_exe64.elf
+ .rela.dyn section with 1 relocations
+ <Relocation (RELA): Container:
+ r_offset = 6295520
+ r_info = 4294967302
+ r_info_sym = 1
+ r_info_type = 6
+ r_addend = 0>
+ offset = 6295520
--- /dev/null
+In file: ./examples/sample_exe64.elf
+ .debug_aranges
+ .debug_pubnames
+ .debug_info
+ .debug_abbrev
+ .debug_line
+ .debug_frame
+ .debug_str
+ .debug_loc
+ .debug_ranges
--- /dev/null
+./examples/sample_exe64.elf: elfclass is 64
+ CU at offset 0x0. address_size is 8
+ CU at offset 0x77. address_size is 8
+ CU at offset 0x102. address_size is 8
+ CU at offset 0x1a2. address_size is 8
--- /dev/null
+Processing file: ./examples/sample_exe64.elf
+ Found a compile unit at offset 0, length 115
+ Top DIE with tag=DW_TAG_compile_unit
+ name=../sysdeps/x86_64/elf/start.S
+ Found a compile unit at offset 119, length 135
+ Top DIE with tag=DW_TAG_compile_unit
+ name=init.c
+ Found a compile unit at offset 258, length 156
+ Top DIE with tag=DW_TAG_compile_unit
+ name=z.c
+ Found a compile unit at offset 418, length 300
+ Top DIE with tag=DW_TAG_compile_unit
+ name=elf-init.c
#!/usr/bin/env python
#-------------------------------------------------------------------------------
-# tests/run_all_unittests.py
+# test/run_all_unittests.py
#
# Run all unit tests (alternative to running 'python -m unittest discover ...')
#
--- /dev/null
+#!/usr/bin/env python
+#-------------------------------------------------------------------------------
+# test/run_examples_test.py
+#
+# Run the examples and compare their output to a reference
+#
+# Eli Bendersky (eliben@gmail.com)
+# This code is in the public domain
+#-------------------------------------------------------------------------------
+import os, sys
+import logging
+sys.path.insert(0, '.')
+from test.utils import run_exe, is_in_rootdir, dump_output_to_temp_files
+
+
+# Create a global logger object
+#
+testlog = logging.getLogger('run_examples_test')
+testlog.setLevel(logging.DEBUG)
+testlog.addHandler(logging.StreamHandler(sys.stdout))
+
+
+def discover_examples():
+ """ Return paths to all example scripts. Assume we're in the root source
+ dir of pyelftools.
+ """
+ root = './examples'
+ for filename in os.listdir(root):
+ if os.path.splitext(filename)[1] == '.py':
+ yield os.path.join(root, filename)
+
+
+def reference_output_path(example_path):
+ """ Compute the reference output path from a given example path.
+ """
+ examples_root, example_name = os.path.split(example_path)
+ example_noext, _ = os.path.splitext(example_name)
+ return os.path.join(examples_root, 'reference_output', example_noext + '.out')
+
+
+def run_example_and_compare(example_path):
+ testlog.info("Example '%s'" % example_path)
+
+ reference_path = reference_output_path(example_path)
+ ref_str = ''
+ try:
+ with open(reference_path) as ref_f:
+ ref_str = ref_f.read()
+ except (IOError, OSError) as e:
+ testlog.info('.......ERROR - reference output cannot be read! - %s' % e)
+ return False
+
+ rc, example_out = run_exe(example_path, ['./examples/sample_exe64.elf'])
+ if rc != 0:
+ testlog.info('.......ERROR - example returned error code %s' % rc)
+ return False
+
+ if example_out == ref_str:
+ return True
+ else:
+ testlog.info('.......FAIL comparison')
+ dump_output_to_temp_files(testlog, example_out)
+ return False
+
+
+def main():
+ if not is_in_rootdir():
+ testlog.error('Error: Please run me from the root dir of pyelftools!')
+ return 1
+
+ success = True
+ for example_path in discover_examples():
+ if success:
+ success = success and run_example_and_compare(example_path)
+
+ if success:
+ testlog.info('\nConclusion: SUCCESS')
+ return 0
+ else:
+ testlog.info('\nConclusion: FAIL')
+ return 1
+
+
+if __name__ == '__main__':
+ sys.exit(main())
+
#!/usr/bin/env python
#-------------------------------------------------------------------------------
-# tests/run_readelf_tests.py
+# test/run_readelf_tests.py
#
# Automatic test runner for elftools & readelf
#
from difflib import SequenceMatcher
from optparse import OptionParser
import logging
-import tempfile
import platform
-from test.utils import run_exe, is_in_rootdir
+sys.path.insert(0, '.') # to load *our* test, not Python's test
+from test.utils import run_exe, is_in_rootdir, dump_output_to_temp_files
# Create a global logger object
testlog.info('.......................FAIL')
testlog.info('....for option "%s"' % option)
testlog.info('@@ ' + errmsg)
- dump_output_to_temp_files(*stdouts)
+ dump_output_to_temp_files(testlog, *stdouts)
return success
i, lines1[i], lines2[i])
return False, errmsg
return True, ''
-
-def dump_output_to_temp_files(*args):
- """ Dumps the output strings given in 'args' to temp files: one for each
- arg.
- """
- for i, s in enumerate(args):
- fd, path = tempfile.mkstemp(
- prefix='out' + str(i + 1) + '_',
- suffix='.stdout')
- file = os.fdopen(fd, 'w')
- file.write(s)
- file.close()
- testlog.info('@@ Output #%s dumped to file: %s' % (i + 1, path))
-
def main():
if not is_in_rootdir():
success = True
for filename in filenames:
- success = success and run_test_on_file(
+ if success:
+ success = success and run_test_on_file(
filename,
verbose=options.verbose)
-import os, subprocess
+#-------------------------------------------------------------------------------
+# test/utils.py
+#
+# Some common utils for tests
+#
+# Eli Bendersky (eliben@gmail.com)
+# This code is in the public domain
+#-------------------------------------------------------------------------------
+import os, subprocess, tempfile
def run_exe(exe_path, args):
dirstuff = os.listdir('.')
return 'test' in dirstuff and 'elftools' in dirstuff
+
+def dump_output_to_temp_files(testlog, *args):
+ """ Dumps the output strings given in 'args' to temp files: one for each
+ arg.
+ """
+ for i, s in enumerate(args):
+ fd, path = tempfile.mkstemp(
+ prefix='out' + str(i + 1) + '_',
+ suffix='.stdout')
+ file = os.fdopen(fd, 'w')
+ file.write(s)
+ file.close()
+ testlog.info('@@ Output #%s dumped to file: %s' % (i + 1, path))
+