mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			
		
			
				
	
	
		
			76 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
"""
 | 
						|
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)
 |