symbols-check: fix `nm` invocation on MacOS

According to Mac OSX's man page [1], this is how we should get the list
of exported symbols:
  nm -g -P foo.dylib

-g to only show the exported symbols
-P to show it in a "portable" format, ie. readable by a script

Since this is supported by GNU nm as well, let's use that everywhere,
although some care needs to be taken as there are some differences in
the output.

[1] https://www.unix.com/man-page/osx/1/nm/

Signed-off-by: Eric Engestrom <eric.engestrom@intel.com>
Tested-by: Vinson Lee <vlee@freedesktop.org>
This commit is contained in:
Eric Engestrom 2019-08-03 18:08:38 +01:00
parent 59f8809f3c
commit 8f1cdac793
1 changed files with 14 additions and 4 deletions

View File

@ -1,8 +1,9 @@
#!/usr/bin/env python
import argparse
import subprocess
import os
import platform
import subprocess
# This list contains symbols that _might_ be exported for some platforms
PLATFORM_SYMBOLS = [
@ -23,13 +24,22 @@ def get_symbols(nm, lib):
List all the (non platform-specific) symbols exported by the library
'''
symbols = []
output = subprocess.check_output([nm, '--format=bsd', '-D', '--defined-only', lib],
platform_name = platform.system()
output = subprocess.check_output([nm, '-gP', lib],
stderr=open(os.devnull, 'w')).decode("ascii")
for line in output.splitlines():
(_, _, symbol_name) = line.split()
if symbol_name in PLATFORM_SYMBOLS:
fields = line.split()
if len(fields) == 2 or fields[1] == 'U':
continue
symbol_name = fields[0]
if platform_name == 'Linux':
if symbol_name in PLATFORM_SYMBOLS:
continue
elif platform_name == 'Darwin':
assert symbol_name[0] == '_'
symbol_name = symbol_name[1:]
symbols.append(symbol_name)
return symbols