| #!/usr/bin/env python3 |
| |
| import subprocess |
| import sys |
| |
| def linker_script_symbols(script): |
| symbols = set() |
| in_symbols = False |
| with open(script, 'r') as f: |
| for line in f.readlines(): |
| if in_symbols: |
| if line.lstrip() == '};\n': |
| break |
| line = line.lstrip() |
| line = line.rstrip('\n') |
| line = line.rstrip(';') |
| symbols.add(line.strip('"')) |
| elif line.lstrip() == 'extern "C++" {\n': |
| in_symbols = True |
| return symbols |
| |
| def elf_visible_symbols(path): |
| p = subprocess.Popen(['nm', '-jUCD', path], stdout=subprocess.PIPE, encoding='ascii') |
| data = p.communicate() |
| return frozenset(data[0].splitlines()) |
| |
| if len(sys.argv) < 3: |
| print("Usage: %s script lib" % sys.argv[0]) |
| sys.exit(1) |
| |
| script_symbols = linker_script_symbols(sys.argv[1]) |
| elf_symbols = elf_visible_symbols(sys.argv[2]) |
| |
| symbols = script_symbols - elf_symbols |
| if symbols: |
| print('The following symbols are in version script %s and not in library %s' % (sys.argv[1], sys.argv[2])) |
| print('\n'.join(sorted(symbols))) |
| sys.exit(1) |
| |
| sys.exit(0) |