| #!/usr/bin/env python3 |
| |
| # 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 |
| 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) |
| |