diff options
-rwxr-xr-x | Tools/scripts/nm2def.py | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/Tools/scripts/nm2def.py b/Tools/scripts/nm2def.py new file mode 100755 index 0000000..120c106 --- /dev/null +++ b/Tools/scripts/nm2def.py @@ -0,0 +1,102 @@ +"""nm2def.py + +Helpers to extract symbols from Unix libs and auto-generate +Windows definition files from them. Depends on nm(1). Tested +on Linux and Solaris only (-p option to nm is for Solaris only). + +By Marc-Andre Lemburg, Aug 1998. + +Additional notes: the output of nm is supposed to look like this: + +acceler.o: +000001fd T PyGrammar_AddAccelerators + U PyGrammar_FindDFA +00000237 T PyGrammar_RemoveAccelerators + U _IO_stderr_ + U exit + U fprintf + U free + U malloc + U printf + +grammar1.o: +00000000 T PyGrammar_FindDFA +00000034 T PyGrammar_LabelRepr + U _PyParser_TokenNames + U abort + U printf + U sprintf + +... + +Even if this isn't the default output of your nm, there is generally an +option to produce this format (since it is the original v7 Unix format). + +""" +import os,re,string,sys + +PYTHONLIB = 'libpython'+sys.version[:3]+'.a' +PC_PYTHONLIB = 'Python'+sys.version[0]+sys.version[2]+'.dll' +NM = 'nm -p -g %s' # For Linux, use "nm -g %s" + +def symbols(lib=PYTHONLIB,types=('T','C','D')): + + lines = os.popen(NM % lib).readlines() + lines = map(string.strip,lines) + symbols = {} + for line in lines: + if len(line) == 0 or ':' in line: + continue + items = string.split(line) + if len(items) != 3: + continue + address, type, name = items + if type not in types: + continue + symbols[name] = address,type + return symbols + +def export_list(symbols): + + data = [] + code = [] + for name,(addr,type) in symbols.items(): + if type in ('C','D'): + data.append('\t'+name) + else: + code.append('\t'+name) + data.sort() + data.append('') + code.sort() + return string.join(data,' DATA\n')+'\n'+string.join(code,'\n') + +# Definition file template +DEF_TEMPLATE = """\ +EXPORTS +%s +""" + +# Special symbols that have to be included even though they don't +# pass the filter +SPECIALS = ( + ) + +def filter_Python(symbols,specials=SPECIALS): + + for name in symbols.keys(): + if name[:2] == 'Py' or name[:3] == '_Py': + pass + elif name not in specials: + del symbols[name] + +def main(): + + s = symbols(PYTHONLIB) + filter_Python(s) + exports = export_list(s) + f = sys.stdout # open('PC/python_nt.def','w') + f.write(DEF_TEMPLATE % (exports)) + f.close() + +if __name__ == '__main__': + main() |