diff options
author | Eric Engestrom <[email protected]> | 2019-10-29 21:42:16 +0000 |
---|---|---|
committer | Eric Engestrom <[email protected]> | 2019-11-05 20:31:37 +0000 |
commit | 4d5cde1fffc4f1c61a58164a619466371948b704 (patch) | |
tree | aeae10b202915a6a530ee929cae4c1ecf683f53e /bin/symbols-check.py | |
parent | 2f652e0b3691e94d6a81e37985741d35561b2312 (diff) |
meson: add windows support to symbols checks
Signed-off-by: Eric Engestrom <[email protected]>
Reviwed-by: Dylan Baker <dylan@pnwbakers>
Diffstat (limited to 'bin/symbols-check.py')
-rw-r--r-- | bin/symbols-check.py | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/bin/symbols-check.py b/bin/symbols-check.py index 47305919634..0d56a19561e 100644 --- a/bin/symbols-check.py +++ b/bin/symbols-check.py @@ -19,9 +19,10 @@ PLATFORM_SYMBOLS = [ ] -def get_symbols(nm, lib): +def get_symbols_nm(nm, lib): ''' List all the (non platform-specific) symbols exported by the library + using `nm` ''' symbols = [] platform_name = platform.system() @@ -39,7 +40,35 @@ def get_symbols(nm, lib): assert symbol_name[0] == '_' symbol_name = symbol_name[1:] symbols.append(symbol_name) + return symbols + +def get_symbols_dumpbin(dumpbin, lib): + ''' + List all the (non platform-specific) symbols exported by the library + using `dumpbin` + ''' + symbols = [] + output = subprocess.check_output([dumpbin, '/exports', lib], + stderr=open(os.devnull, 'w')).decode("ascii") + for line in output.splitlines(): + fields = line.split() + # The lines with the symbols are made of at least 4 columns; see details below + if len(fields) < 4: + continue + try: + # Making sure the first 3 columns are a dec counter, a hex counter + # and a hex address + _ = int(fields[0], 10) + _ = int(fields[1], 16) + _ = int(fields[2], 16) + except ValueError: + continue + symbol_name = fields[3] + # De-mangle symbols + if symbol_name[0] == '_': + symbol_name = symbol_name[1:].split('@')[0] + symbols.append(symbol_name) return symbols @@ -55,12 +84,21 @@ def main(): help='path to library') parser.add_argument('--nm', action='store', - required=True, + help='path to binary (or name in $PATH)') + parser.add_argument('--dumpbin', + action='store', help='path to binary (or name in $PATH)') args = parser.parse_args() try: - lib_symbols = get_symbols(args.nm, args.lib) + if platform.system() == 'Windows': + if not args.dumpbin: + parser.error('--dumpbin is mandatory') + lib_symbols = get_symbols_dumpbin(args.dumpbin, args.lib) + else: + if not args.nm: + parser.error('--nm is mandatory') + lib_symbols = get_symbols_nm(args.nm, args.lib) except: # We can't run this test, but we haven't technically failed it either # Return the GNU "skip" error code |