From f93a5e6a7dad4fde2bf61c241bf32da678525c8b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 24 May 2019 17:02:38 -0400 Subject: [PATCH] [win] Add mingw-ldd.py Part of https://github.com/harfbuzz/harfbuzz/issues/1728 --- mingw-ldd.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100755 mingw-ldd.py diff --git a/mingw-ldd.py b/mingw-ldd.py new file mode 100755 index 000000000..1d659efa4 --- /dev/null +++ b/mingw-ldd.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python + +# Copied from https://github.com/xantares/mingw-ldd/blob/master/mingw-ldd.py +# Modified to point to right prefix location on Fedora. + +# WTFPL - Do What the Fuck You Want to Public License +from __future__ import print_function +import pefile +import os +import sys + + +def get_dependency(filename): + deps = [] + pe = pefile.PE(filename) + for imp in pe.DIRECTORY_ENTRY_IMPORT: + deps.append(imp.dll.decode()) + return deps + + +def dep_tree(root, prefix=None): + if not prefix: + arch = get_arch(root) + #print('Arch =', arch) + prefix = '/usr/'+arch+'-w64-mingw32/sys-root/mingw/bin' + #print('Using default prefix', prefix) + dep_dlls = dict() + + def dep_tree_impl(root, prefix): + for dll in get_dependency(root): + if dll in dep_dlls: + continue + full_path = os.path.join(prefix, dll) + if os.path.exists(full_path): + dep_dlls[dll] = full_path + dep_tree_impl(full_path, prefix=prefix) + else: + dep_dlls[dll] = 'not found' + + dep_tree_impl(root, prefix) + return (dep_dlls) + + +def get_arch(filename): + type2arch= {pefile.OPTIONAL_HEADER_MAGIC_PE: 'i686', + pefile.OPTIONAL_HEADER_MAGIC_PE_PLUS: 'x86_64'} + pe = pefile.PE(filename) + try: + return type2arch[pe.PE_TYPE] + except KeyError: + sys.stderr.write('Error: unknown architecture') + sys.exit(1) + +if __name__ == '__main__': + filename = sys.argv[1] + for dll, full_path in dep_tree(filename).items(): + print(' ' * 7, dll, '=>', full_path) +