1*76d0caaeSpatrick#!/usr/bin/env python 2*76d0caaeSpatrick#===----------------------------------------------------------------------===## 3*76d0caaeSpatrick# 4*76d0caaeSpatrick# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*76d0caaeSpatrick# See https://llvm.org/LICENSE.txt for license information. 6*76d0caaeSpatrick# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*76d0caaeSpatrick# 8*76d0caaeSpatrick#===----------------------------------------------------------------------===## 9*76d0caaeSpatrick 10*76d0caaeSpatrickimport argparse 11*76d0caaeSpatrickimport io 12*76d0caaeSpatrickimport libcxx.sym_check.extract 13*76d0caaeSpatrickimport libcxx.sym_check.util 14*76d0caaeSpatrickimport pprint 15*76d0caaeSpatrickimport sys 16*76d0caaeSpatrick 17*76d0caaeSpatrickdef OutputFile(file): 18*76d0caaeSpatrick if isinstance(file, io.IOBase): 19*76d0caaeSpatrick return file 20*76d0caaeSpatrick assert isinstance(file, str), "Got object {} which is not a str".format(file) 21*76d0caaeSpatrick return open(file, 'w', newline='\n') 22*76d0caaeSpatrick 23*76d0caaeSpatrickdef main(argv): 24*76d0caaeSpatrick parser = argparse.ArgumentParser( 25*76d0caaeSpatrick description='Extract a list of symbols from a shared library.') 26*76d0caaeSpatrick parser.add_argument('library', metavar='LIB', type=str, 27*76d0caaeSpatrick help='The library to extract symbols from.') 28*76d0caaeSpatrick parser.add_argument('-o', '--output', dest='output', type=OutputFile, default=sys.stdout, 29*76d0caaeSpatrick help='The output file to write the symbols to. It is overwritten if it already exists. ' 30*76d0caaeSpatrick 'If no file is specified, the results are written to standard output.') 31*76d0caaeSpatrick args = parser.parse_args(argv) 32*76d0caaeSpatrick 33*76d0caaeSpatrick symbols = libcxx.sym_check.extract.extract_symbols(args.library) 34*76d0caaeSpatrick symbols, _ = libcxx.sym_check.util.filter_stdlib_symbols(symbols) 35*76d0caaeSpatrick 36*76d0caaeSpatrick lines = [pprint.pformat(sym, width=99999) for sym in symbols] 37*76d0caaeSpatrick args.output.writelines('\n'.join(sorted(lines))) 38*76d0caaeSpatrick 39*76d0caaeSpatrickif __name__ == '__main__': 40*76d0caaeSpatrick main(sys.argv[1:]) 41