aboutsummaryrefslogtreecommitdiffstats
path: root/longbow/src/python/site-packages/longbow/SymbolTable.py
diff options
context:
space:
mode:
Diffstat (limited to 'longbow/src/python/site-packages/longbow/SymbolTable.py')
-rwxr-xr-xlongbow/src/python/site-packages/longbow/SymbolTable.py87
1 files changed, 87 insertions, 0 deletions
diff --git a/longbow/src/python/site-packages/longbow/SymbolTable.py b/longbow/src/python/site-packages/longbow/SymbolTable.py
new file mode 100755
index 00000000..20a909d7
--- /dev/null
+++ b/longbow/src/python/site-packages/longbow/SymbolTable.py
@@ -0,0 +1,87 @@
+#! /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)