#!/usr/bin/env python3

import re
import subprocess
import sys

def bss_symbols(lib, sfilter=None):
    symbols = []
    p = subprocess.Popen(['objdump', '-t', '-j', '.bss', '-C', lib], stdout=subprocess.PIPE)
    data = p.communicate()[0]
    pattern = re.compile('^[0-9a-f]+ ([a-zA-Z ])[a-zA-Z ][a-zA-Z ][a-zA-Z ][a-zA-Z ][a-zA-Z ][a-zA-Z ] \.bss\t[0-9a-f]+ +(.*)$')
    for line in data.splitlines():
        m = pattern.match(line.decode('utf-8', 'ignore'))
        if not m:
            continue
        if sfilter is None or sfilter(m.group(1)):
            symbols.append(m.group(2))

    return symbols

if len(sys.argv) < 3:
    print("Usage: %s lib1 lib2" % sys.argv[0])
    sys.exit(1)

s1 = bss_symbols(sys.argv[1], lambda x: x == 'u')
s2 = bss_symbols(sys.argv[2], lambda x: x != 'u')

symbols = []
for symbol in s1:
    if symbol in s2:
        symbols.append(symbol)

if symbols:
    print('The following symbols are global in %s and not in %s' % (sys.argv[1], sys.argv[2]))
    print('\n'.join(sorted(symbols)))
    sys.exit(1)

sys.exit(0)
