7 # This list contains symbols that _might_ be exported for some platforms
21 def get_symbols(nm
, lib
):
23 List all the (non platform-specific) symbols exported by the library
26 output
= subprocess
.check_output([nm
, '--format=bsd', '-D', '--defined-only', lib
],
27 stderr
=open(os
.devnull
, 'w')).decode("ascii")
28 for line
in output
.splitlines():
29 (_
, _
, symbol_name
) = line
.split()
30 symbols
.append(symbol_name
)
35 parser
= argparse
.ArgumentParser()
36 parser
.add_argument('--symbols-file',
39 help='path to file containing symbols')
40 parser
.add_argument('--lib',
43 help='path to library')
44 parser
.add_argument('--nm',
47 help='path to binary (or name in $PATH)')
48 args
= parser
.parse_args()
50 lib_symbols
= get_symbols(args
.nm
, args
.lib
)
51 mandatory_symbols
= []
53 with
open(args
.symbols_file
) as symbols_file
:
54 qualifier_optional
= '(optional)'
55 for line
in symbols_file
.readlines():
58 line
= line
.split('#')[0]
71 elif len(fields
) == 2:
75 print(args
.symbols_file
+ ': invalid format: ' + line
)
78 # The only supported qualifier is 'optional', which means the
79 # symbol doesn't have to be exported by the library
80 if qualifier
and not qualifier
== qualifier_optional
:
81 print(args
.symbols_file
+ ': invalid qualifier: ' + qualifier
)
84 if qualifier
== qualifier_optional
:
85 optional_symbols
.append(symbol
)
87 mandatory_symbols
.append(symbol
)
90 for symbol
in lib_symbols
:
91 if symbol
in mandatory_symbols
:
93 if symbol
in optional_symbols
:
95 if symbol
in PLATFORM_SYMBOLS
:
97 unknown_symbols
.append(symbol
)
100 sym
for sym
in mandatory_symbols
if sym
not in lib_symbols
103 for symbol
in unknown_symbols
:
104 print(args
.lib
+ ': unknown symbol exported: ' + symbol
)
106 for symbol
in missing_symbols
:
107 print(args
.lib
+ ': missing symbol: ' + symbol
)
109 if unknown_symbols
or missing_symbols
:
114 if __name__
== '__main__':