#! /usr/bin/env python # Copyright (c) 2017 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # import os import subprocess import re import sys import pprint def parseLocation(location): token = location.split("[") objectFileName = location if len(token) > 1: libraryName = token[0] objectFileName = token[1].split("]")[0] else: libraryName = None objectFileName = objectFileName.split(":")[0] return (libraryName, objectFileName) def parseDarwinOutput(lines, accumulator = { }): for line in lines: token = line.split(" ") fullName = token[0] libraryName, objectFileName = parseLocation(token[0]) name = token[1] type = token[2] if fullName in accumulator: if type == "U": accumulator[fullName]["undefined"].append({ "name" : name }) elif type == "T": accumulator[fullName]["defined"].append({ "name" : name }) elif type == "D": accumulator[fullName]["globalData"].append({ "name" : name }) else: accumulator[fullName] = { "fullName" : fullName, "libraryName" : libraryName, "objectFileName" : objectFileName, "defined" : [], "undefined" : [], "globalData" : [] } return accumulator def getDarwinSymbolTable(objectFileName, accumulator = { }): command = [ "/usr/bin/nm", "-PAog", objectFileName ] output = subprocess.check_output(command) lines = output.splitlines() return parseDarwinOutput(lines, accumulator) def getSymbolTable(objectFileName, accumulator = { }): ''' { fullName : { "defined" : list of dictionaries, "undefined": list of dictionaries, "globalData" : list of dictionaries, "libraryName" : string "objectFileName : string }, } ''' return getDarwinSymbolTable(objectFileName, accumulator) if __name__ == '__main__': table = dict() for f in sys.argv: table = getSymbolTable(f, table) pp = pprint.PrettyPrinter(indent=4, width=132) pp.pprint(table)