有这样一个Txt文件,它包含了多个.o文件及其对应的函数信息:
test.txt
Symbols from __ctype_tab.o:
Name Value Class Type Size Line Section
__ctype |00000000| D | OBJECT|00000004| |.data
__ctype_tab |00000000| r | OBJECT|00000101| |.rodata
Symbols from _ashldi3.o:
Name Value Class Type Size Line Section
__ashldi3 |00000000| T | FUNC|00000050| |.text
Symbols from _ashrdi3.o:
Name Value Class Type Size Line Section
__ashrdi3 |00000000| T | FUNC|00000058| |.text
Symbols from _fixdfdi.o:
Name Value Class Type Size Line Section
__fixdfdi |00000000| T | FUNC|0000004c| |.text
__fixunsdfdi | | U | NOTYPE| | |*UND*
Symbols from _fixsfdi.o:
Name Value Class Type Size Line Section
__fixsfdi |00000000| T | FUNC|0000004c| |.text
__fixunssfdi | | U | NOTYPE| | |*UND*
Symbols from _fixunssfdi.o:
Name Value Class Type Size Line Section
__cmpdi2 | | U | NOTYPE| | |*UND*
__fixunssfdi |00000000| T | FUNC|00000228| |.text
__floatdidf | | U | NOTYPE| | |*UND*
问题是,给定一个类型为NOTYPE的函数,我们如何找到它在哪个.o文件中被定义,以及找到该.o文件后,我们如何找到其他NOTYPE函数在哪里被定义,以此类推。最终,我们需要返回一个列表,其中包含所有包含这些函数的.o文件名称。
2、解决方案
我们可以使用正则表达式来解决这个问题。正则表达式是一种强大的模式匹配工具,可以帮助我们提取文本中的特定信息。
以下是解决该问题的Python代码:
import re
def find_ofile(funcname):
"""This will find .o file for given function."""
for ofile, fns in funcDict.iteritems():
if funcname in fns:
return ofile
raise Exception("Cannot find function "+funcname)
def find_dependencies(ofile, deps = None):
"""This will find dependent .o files for given .o file."""
olist = deps if deps else set([])
for fn in notypeDict[ofile]:
ofile = find_ofile(fn)
if not ofile in olist:
olist.add(ofile)
olist = find_dependencies(ofile, olist)
return olist
def find_dep_for_func(notype_funcname):
return find_dependencies(find_ofile(funcname))
notypeDict = {}
funcDict = {}
notypeList = []
funcList = []
currObj = ''
prevObj = ''
fp = open(r'C:\test.txt','r') # file path cms here
fileList = fp.readlines()
for line in fileList:
if '.o' in line: # line containg .o
currObj = line.split()[-1][0:-1]
elif '|' not in line: # line containg |
pass
else: # other lines
dataList = [dataItem.strip() for dataItem in line.strip().split('|')] # a list of each word in line
name = dataList[0].strip() # name of the function
notypeDict[prevObj] = notypeList # notypeDict is a dictionary which contains .o as key and a list of NOTYPE function name
funcDict[prevObj] = funcList # funcDict is a dictionary which contains .o as key and a list of FUNC function names
if prevObj == currObj :
pass
elif prevObj != currObj :
notypeList = []
funcList = []
if dataList[3] == 'NOTYPE' :
notypeList.append(name)
elif dataList[3] == 'FUNC' :
funcList.append(name)
prevObj = currObj
print 'notypeDict' , notypeDict
print '\n\nfuncDict' , funcDict
print find_dep_for_func('__fixunsdfdi')
这段代码首先使用正则表达式从Txt文件中提取出.o文件列表和函数列表。然后,它使用两个字典来存储.o文件和函数之间的关系。其中,notypeDict存储了.o文件和NOTYPE函数之间的关系,funcDict存储了.o文件和FUNC函数之间的关系。
接下来,代码使用find_ofile()函数来查找给定函数所在的.o文件。然后,它使用find_dependencies()函数来查找给定.o文件所依赖的其他.o文件。最后,它使用find_dep_for_func()函数来查找给定NOTYPE函数所依赖的所有.o文件。
以下是对这段代码的解释:
-
首先,我们定义了三个函数:find_ofile()、find_dependencies()和find_dep_for_func()。这些函数用于查找.o文件、依赖关系和依赖.o文件列表。
-
然后,我们定义了两个字典:notypeDict和funcDict。这两个字典用于存储.o文件和函数之间的关系。
-
接下来,我们使用open()函数打开Txt文件,然后使用readlines()函数将文件中的所有行读入一个列表。
-
然后,我们遍历文件中的每一行。如果该行包含
.o,则我们将其作为当前的.o文件。如果该行不包含|,则我们将其忽略。否则,我们将该行拆分成一个列表,并提取出函数的名称、类型和大小。 -
如果函数的类型是NOTYPE,则我们将函数的名称添加到notypeDict中。如果函数的类型是FUNC,则我们将函数的名称添加到funcDict中。
-
最后,我们打印出notypeDict和funcDict。
-
为了测试代码,我们调用find_dep_for_func()函数来查找__fixunsdfdi函数所依赖的所有.o文件。