| Index: tools/checkbin/checkbin.py
|
| diff --git a/tools/checkbin/checkbin.py b/tools/checkbin/checkbin.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..318720e32cec380bb13f53f757730a32cf613536
|
| --- /dev/null
|
| +++ b/tools/checkbin/checkbin.py
|
| @@ -0,0 +1,65 @@
|
| +#!/usr/bin/python
|
| +# Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +"""Makes sure that all EXE and DLL files in the provided directory were built
|
| +correctly.
|
| +
|
| +Currently this tool will check that binaries were built with /NXCOMPAT and
|
| +/DYNAMICBASE set.
|
| +"""
|
| +
|
| +import os
|
| +import optparse
|
| +import sys
|
| +
|
| +import pefile
|
| +
|
| +PE_FILE_EXTENSIONS = ['.exe', '.dll']
|
| +DYNAMICBASE_FLAG = 0x0040
|
| +NXCOMPAT_FLAG = 0x0100
|
| +
|
| +def IsPEFile(path):
|
| + return (os.path.isfile(path) and
|
| + os.path.splitext(path)[1].lower() in PE_FILE_EXTENSIONS)
|
| +
|
| +def main(options, args):
|
| + directory = args[0]
|
| + success = True
|
| +
|
| + for file in os.listdir(directory):
|
| + path = os.path.abspath(os.path.join(directory, file))
|
| + if not IsPEFile(path):
|
| + continue
|
| + pe = pefile.PE(path, fast_load=True)
|
| +
|
| + # Check for /DYNAMICBASE.
|
| + if pe.OPTIONAL_HEADER.DllCharacteristics & DYNAMICBASE_FLAG:
|
| + if options.verbose:
|
| + print "Checking %s for /DYNAMICBASE... PASS" % path
|
| + else:
|
| + success = False
|
| + print "Checking %s for /DYNAMICBASE... FAIL" % path
|
| +
|
| + # Check for /NXCOMPAT.
|
| + if pe.OPTIONAL_HEADER.DllCharacteristics & NXCOMPAT_FLAG:
|
| + if options.verbose:
|
| + print "Checking %s for /NXCOMPAT... PASS" % path
|
| + else:
|
| + success = False
|
| + print "Checking %s for /NXCOMPAT... FAIL" % path
|
| +
|
| + if not success:
|
| + sys.exit(1)
|
| +
|
| +if __name__ == '__main__':
|
| + usage = "Usage: %prog [options] DIRECTORY"
|
| + option_parser = optparse.OptionParser(usage=usage)
|
| + option_parser.add_option("-v", "--verbose", action="store_true",
|
| + default=False, help="Print debug logging")
|
| + options, args = option_parser.parse_args()
|
| + if not args:
|
| + option_parser.print_help()
|
| + sys.exit(0)
|
| + main(options, args)
|
|
|