binman: Support enabling debug in tests

The elf module can provide some debugging information to assist with
figuring out what is going wrong. This is also useful in tests. Update the
-D option so that it is passed through to tests as well.

Signed-off-by: Simon Glass <sjg@chromium.org>
diff --git a/tools/binman/binman.py b/tools/binman/binman.py
index 81a613d..aa51396 100755
--- a/tools/binman/binman.py
+++ b/tools/binman/binman.py
@@ -31,7 +31,7 @@
 import command
 import control
 
-def RunTests():
+def RunTests(debug):
     """Run the functional tests and any embedded doctests"""
     import elf_test
     import entry_test
@@ -46,6 +46,8 @@
         suite.run(result)
 
     sys.argv = [sys.argv[0]]
+    if debug:
+        sys.argv.append('-D')
 
     # Run the entry tests first ,since these need to be the first to import the
     # 'entry' module.
@@ -111,7 +113,7 @@
         sys.tracebacklimit = 0
 
     if options.test:
-        ret_code = RunTests()
+        ret_code = RunTests(options.debug)
 
     elif options.test_coverage:
         RunTestCoverage()
diff --git a/tools/binman/control.py b/tools/binman/control.py
index e9d48df..e175e8d 100644
--- a/tools/binman/control.py
+++ b/tools/binman/control.py
@@ -12,6 +12,7 @@
 import tools
 
 import command
+import elf
 import fdt
 import fdt_util
 from image import Image
@@ -89,6 +90,8 @@
 
     try:
         tout.Init(options.verbosity)
+        if options.debug:
+            elf.debug = True
         try:
             tools.SetInputDirs(options.indir)
             tools.PrepareOutputDir(options.outdir, options.preserve)
diff --git a/tools/binman/elf.py b/tools/binman/elf.py
index 97208b1..0fb5a4a 100644
--- a/tools/binman/elf.py
+++ b/tools/binman/elf.py
@@ -14,6 +14,9 @@
 
 import tools
 
+# This is enabled from control.py
+debug = False
+
 Symbol = namedtuple('Symbol', ['section', 'address', 'size', 'weak'])
 
 # Used for tests which don't have an ELF file to read
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index 372b61f..2bee6a1 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -136,7 +136,10 @@
         Returns:
             Return value (0 for success)
         """
-        (options, args) = cmdline.ParseArgs(list(args))
+        args = list(args)
+        if '-D' in sys.argv:
+            args = args + ['-D']
+        (options, args) = cmdline.ParseArgs(args)
         options.pager = 'binman-invalid-pager'
         options.build_dir = self._indir
 
@@ -144,14 +147,16 @@
         # options.verbosity = tout.DEBUG
         return control.Binman(options, args)
 
-    def _DoTestFile(self, fname):
+    def _DoTestFile(self, fname, debug=False):
         """Run binman with a given test file
 
         Args:
             fname: Device tree source filename to use (e.g. 05_simple.dts)
         """
-        return self._DoBinman('-p', '-I', self._indir,
-                              '-d', self.TestFile(fname))
+        args = ['-p', '-I', self._indir, '-d', self.TestFile(fname)]
+        if debug:
+            args.append('-D')
+        return self._DoBinman(*args)
 
     def _SetupDtb(self, fname, outfile='u-boot.dtb'):
         """Set up a new test device-tree file
@@ -363,6 +368,10 @@
         data = self._DoReadFile('05_simple.dts')
         self.assertEqual(U_BOOT_DATA, data)
 
+    def testSimpleDebug(self):
+        """Test a simple binman run with debugging enabled"""
+        data = self._DoTestFile('05_simple.dts', debug=True)
+
     def testDual(self):
         """Test that we can handle creating two images