Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-tools by
dev/syms.py@0:4a2e5f0422d6, 2016-03-30 (annotated)
- Committer:
- screamer
- Date:
- Wed Mar 30 16:23:44 2016 +0000
- Revision:
- 0:4a2e5f0422d6
Initial revision
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
screamer | 0:4a2e5f0422d6 | 1 | """ |
screamer | 0:4a2e5f0422d6 | 2 | mbed SDK |
screamer | 0:4a2e5f0422d6 | 3 | Copyright (c) 2011-2013 ARM Limited |
screamer | 0:4a2e5f0422d6 | 4 | |
screamer | 0:4a2e5f0422d6 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); |
screamer | 0:4a2e5f0422d6 | 6 | you may not use this file except in compliance with the License. |
screamer | 0:4a2e5f0422d6 | 7 | You may obtain a copy of the License at |
screamer | 0:4a2e5f0422d6 | 8 | |
screamer | 0:4a2e5f0422d6 | 9 | http://www.apache.org/licenses/LICENSE-2.0 |
screamer | 0:4a2e5f0422d6 | 10 | |
screamer | 0:4a2e5f0422d6 | 11 | Unless required by applicable law or agreed to in writing, software |
screamer | 0:4a2e5f0422d6 | 12 | distributed under the License is distributed on an "AS IS" BASIS, |
screamer | 0:4a2e5f0422d6 | 13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
screamer | 0:4a2e5f0422d6 | 14 | See the License for the specific language governing permissions and |
screamer | 0:4a2e5f0422d6 | 15 | limitations under the License. |
screamer | 0:4a2e5f0422d6 | 16 | |
screamer | 0:4a2e5f0422d6 | 17 | |
screamer | 0:4a2e5f0422d6 | 18 | Utility to find which libraries could define a given symbol |
screamer | 0:4a2e5f0422d6 | 19 | """ |
screamer | 0:4a2e5f0422d6 | 20 | from argparse import ArgumentParser |
screamer | 0:4a2e5f0422d6 | 21 | from os.path import join, splitext |
screamer | 0:4a2e5f0422d6 | 22 | from os import walk |
screamer | 0:4a2e5f0422d6 | 23 | from subprocess import Popen, PIPE |
screamer | 0:4a2e5f0422d6 | 24 | |
screamer | 0:4a2e5f0422d6 | 25 | |
screamer | 0:4a2e5f0422d6 | 26 | OBJ_EXT = ['.o', '.a', '.ar'] |
screamer | 0:4a2e5f0422d6 | 27 | |
screamer | 0:4a2e5f0422d6 | 28 | |
screamer | 0:4a2e5f0422d6 | 29 | def find_sym_in_lib(sym, obj_path): |
screamer | 0:4a2e5f0422d6 | 30 | contain_symbol = False |
screamer | 0:4a2e5f0422d6 | 31 | |
screamer | 0:4a2e5f0422d6 | 32 | out = Popen(["nm", "-C", obj_path], stdout=PIPE, stderr=PIPE).communicate()[0] |
screamer | 0:4a2e5f0422d6 | 33 | for line in out.splitlines(): |
screamer | 0:4a2e5f0422d6 | 34 | tokens = line.split() |
screamer | 0:4a2e5f0422d6 | 35 | n = len(tokens) |
screamer | 0:4a2e5f0422d6 | 36 | if n == 2: |
screamer | 0:4a2e5f0422d6 | 37 | sym_type = tokens[0] |
screamer | 0:4a2e5f0422d6 | 38 | sym_name = tokens[1] |
screamer | 0:4a2e5f0422d6 | 39 | elif n == 3: |
screamer | 0:4a2e5f0422d6 | 40 | sym_type = tokens[1] |
screamer | 0:4a2e5f0422d6 | 41 | sym_name = tokens[2] |
screamer | 0:4a2e5f0422d6 | 42 | else: |
screamer | 0:4a2e5f0422d6 | 43 | continue |
screamer | 0:4a2e5f0422d6 | 44 | |
screamer | 0:4a2e5f0422d6 | 45 | if sym_type == "U": |
screamer | 0:4a2e5f0422d6 | 46 | # This object is using this symbol, not defining it |
screamer | 0:4a2e5f0422d6 | 47 | continue |
screamer | 0:4a2e5f0422d6 | 48 | |
screamer | 0:4a2e5f0422d6 | 49 | if sym_name == sym: |
screamer | 0:4a2e5f0422d6 | 50 | contain_symbol = True |
screamer | 0:4a2e5f0422d6 | 51 | |
screamer | 0:4a2e5f0422d6 | 52 | return contain_symbol |
screamer | 0:4a2e5f0422d6 | 53 | |
screamer | 0:4a2e5f0422d6 | 54 | |
screamer | 0:4a2e5f0422d6 | 55 | def find_sym_in_path(sym, dir_path): |
screamer | 0:4a2e5f0422d6 | 56 | for root, _, files in walk(dir_path): |
screamer | 0:4a2e5f0422d6 | 57 | for file in files: |
screamer | 0:4a2e5f0422d6 | 58 | |
screamer | 0:4a2e5f0422d6 | 59 | _, ext = splitext(file) |
screamer | 0:4a2e5f0422d6 | 60 | if ext not in OBJ_EXT: continue |
screamer | 0:4a2e5f0422d6 | 61 | |
screamer | 0:4a2e5f0422d6 | 62 | path = join(root, file) |
screamer | 0:4a2e5f0422d6 | 63 | if find_sym_in_lib(sym, path): |
screamer | 0:4a2e5f0422d6 | 64 | print path |
screamer | 0:4a2e5f0422d6 | 65 | |
screamer | 0:4a2e5f0422d6 | 66 | |
screamer | 0:4a2e5f0422d6 | 67 | if __name__ == '__main__': |
screamer | 0:4a2e5f0422d6 | 68 | parser = ArgumentParser(description='Find Symbol') |
screamer | 0:4a2e5f0422d6 | 69 | parser.add_argument('-s', '--sym', required=True, |
screamer | 0:4a2e5f0422d6 | 70 | help='The symbol to be searched') |
screamer | 0:4a2e5f0422d6 | 71 | parser.add_argument('-p', '--path', required=True, |
screamer | 0:4a2e5f0422d6 | 72 | help='The path where to search') |
screamer | 0:4a2e5f0422d6 | 73 | args = parser.parse_args() |
screamer | 0:4a2e5f0422d6 | 74 | |
screamer | 0:4a2e5f0422d6 | 75 | find_sym_in_path(args.sym, args.path) |