|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- """
- mbed SDK
- Copyright (c) 2011-2013 ARM Limited
-
- 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.
-
-
- Utility to find which libraries could define a given symbol
- """
- from argparse import ArgumentParser
- from os.path import join, splitext
- from os import walk
- from subprocess import Popen, PIPE
-
-
- OBJ_EXT = ['.o', '.a', '.ar']
-
-
- def find_sym_in_lib(sym, obj_path):
- contain_symbol = False
-
- out = Popen(["nm", "-C", obj_path], stdout=PIPE, stderr=PIPE).communicate()[0]
- for line in out.splitlines():
- tokens = line.split()
- n = len(tokens)
- if n == 2:
- sym_type = tokens[0]
- sym_name = tokens[1]
- elif n == 3:
- sym_type = tokens[1]
- sym_name = tokens[2]
- else:
- continue
-
- if sym_type == "U":
- # This object is using this symbol, not defining it
- continue
-
- if sym_name == sym:
- contain_symbol = True
-
- return contain_symbol
-
-
- def find_sym_in_path(sym, dir_path):
- for root, _, files in walk(dir_path):
- for file in files:
-
- _, ext = splitext(file)
- if ext not in OBJ_EXT: continue
-
- path = join(root, file)
- if find_sym_in_lib(sym, path):
- print path
-
-
- if __name__ == '__main__':
- parser = ArgumentParser(description='Find Symbol')
- parser.add_argument('-s', '--sym', required=True,
- help='The symbol to be searched')
- parser.add_argument('-p', '--path', required=True,
- help='The path where to search')
- args = parser.parse_args()
-
- find_sym_in_path(args.sym, args.path)
|