Created
April 28, 2015 15:32
-
-
Save rygorous/f17242d1b76c068834c2 to your computer and use it in GitHub Desktop.
Figure out actual external deps in .a (only tested for OS X/iOS)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """This tool queries undefined symbols in a lib, then queries defined | |
| symbols, and then diffs the two sets so we know what the actual | |
| externals for the purpose of the lib are.""" | |
| import os | |
| import re | |
| import subprocess | |
| libname = 'libbink2.a' # command line parsing? please. | |
| def parse_def_sym(str): | |
| """Parses defined symbols from str.""" | |
| curlib = None | |
| sym_regexp = re.compile('([0-9a-fA-F]+) (.) (\S+)') | |
| syms = {} | |
| for line in str.split('\n'): | |
| match = sym_regexp.match(line) | |
| if line[-1:] == ':': | |
| curlib = line[:-1] | |
| elif match: | |
| syms[match.group(3)] = curlib | |
| return syms | |
| def parse_undef_sym(str): | |
| """Parses undefined symbols from str.""" | |
| curlib = None | |
| syms = {} | |
| for line in str.split('\n'): | |
| if line[-1:] == ':': | |
| curlib = line[:-1] | |
| elif line != '': | |
| syms[line] = curlib | |
| return syms | |
| undef_sym_output = subprocess.check_output(['nm', '-u', libname]) | |
| def_sym_output = subprocess.check_output(['nm', '-Ug', libname]) | |
| def_syms = parse_def_sym(def_sym_output) | |
| undef_syms = parse_undef_sym(undef_sym_output) | |
| # Figure out the symbols that are *really* undefined | |
| undef_list = [] | |
| for usym, ufile in undef_syms.iteritems(): | |
| if not usym in def_syms: | |
| undef_list.append('undef sym %s in %s' % (usym, ufile)) | |
| undef_list.sort() | |
| print('\n'.join(undef_list)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment