1 #!/usr/bin/env python\r
2 #\r
3 # $Source: /cvsstl/ti/pa/bin/symcheck,v $\r
4 # $Revision: 1.3 $\r
5 #\r
6 # symbol check (symcheck) tool\r
7 #\r
8 # Copyright 2008 Texas Instruments Incorporated. All rights reserved.\r
9 # Texas Instruments Proprietary and Confidential.\r
10 # Use without a license from Texas Instruments is prohibited.\r
11 #\r
12 # $Log: symcheck,v $\r
13 # Revision 1.3 2009/05/21 05:21:06 mkumar\r
14 # Rejuggled the letters representing the symbols type from STABED to DABEST :)\r
15 #\r
16 # Revision 1.2 2009/05/20 08:01:15 mkumar\r
17 # nmsetup updated\r
18 #\r
19 # Revision 1.1 2009/05/20 06:16:48 mkumar\r
20 # symbols check tool\r
21 #\r
22 #\r
23 #\r
24 #\r
25 \r
26 import sys,re,os,optparse\r
27 \r
28 usage= "usage: %prog [options] files"\r
29 \r
30 #nm6x setup\r
31 if 'NM' in os.environ:\r
32 nm=os.environ['NM']\r
33 if not os.path.isfile(nm):\r
34 print "NM enviroment variable specified, but",nm,"does not exist"\r
35 sys.exit(1)\r
36 else:\r
37 nm="nm6x"\r
38 \r
39 #parser options\r
40 parser = optparse.OptionParser(usage)\r
41 parser.add_option("-d", action="store_true", \r
42 default=False, help='Show duplicate symbols')\r
43 parser.add_option("--nm", default=nm,\r
44 help='Absolute path of nm6x.exe if not in path (defualt:nm6x)\n OR set NM enviroment variable')\r
45 (options, args) = parser.parse_args()\r
46 \r
47 #help\r
48 if len(args) == 0:\r
49 parser.print_help()\r
50 sys.exit(1)\r
51 \r
52 symbolsall={}\r
53 \r
54 # get symbols from a file\r
55 #look for lines like 0000000 T symbol\r
56 p = re.compile('[0-9a-fA-F]{8,} [DABEST] ')\r
57 def get_symbols(fileName):\r
58 if os.path.isfile(tmpfile):\r
59 os.remove(tmpfile)\r
60 os.system("\"" + options.nm + "\"" + " " + fileName + ">" + tmpfile )\r
61 f=open(tmpfile,"rb")\r
62 symbols={}\r
63 for line in f:\r
64 if p.match(line):\r
65 sp = line.split()\r
66 if sp[1] in symbols.keys():\r
67 symbols[sp[1]].append(sp[2])\r
68 else:\r
69 symbols[sp[1]] = [sp[2]]\r
70 os.remove(tmpfile)\r
71 return symbols\r
72 \r
73 pid=os.getpid()\r
74 tmpfile = "sym" + str(pid) + ".tmp"\r
75 \r
76 # build the dictinoary of all symbols\r
77 for file in args:\r
78 if os.path.isfile(file):\r
79 symbolsall[file]=get_symbols(file)\r
80 \r
81 # check for duplicate symbols\r
82 if options.d:\r
83 dups=[]\r
84 symbollist=[]\r
85 filelist=[]\r
86 for file in symbolsall.keys():\r
87 for symtype in symbolsall[file].keys():\r
88 for sym in symbolsall[file][symtype]:\r
89 if sym in symbollist:\r
90 #found duplicate\r
91 dups.append((sym,file))\r
92 if (sym,filelist[symbollist.index(sym)]) not in dups:\r
93 dups.append((sym,filelist[symbollist.index(sym)]))\r
94 else:\r
95 symbollist.append(sym)\r
96 filelist.append(file)\r
97 if len(dups):\r
98 print "Found duplicate symbols"\r
99 print "duplicate symbol, file"\r
100 for sym,file in dups:\r
101 print sym,",",file\r
102 sys.exit(1)\r
103 \r
104 sys.exit(0)\r