从Txt文件中解析出.o文件列表

58 阅读4分钟

有这样一个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文件。

以下是对这段代码的解释:

  1. 首先,我们定义了三个函数:find_ofile()、find_dependencies()和find_dep_for_func()。这些函数用于查找.o文件、依赖关系和依赖.o文件列表。

  2. 然后,我们定义了两个字典:notypeDict和funcDict。这两个字典用于存储.o文件和函数之间的关系。

  3. 接下来,我们使用open()函数打开Txt文件,然后使用readlines()函数将文件中的所有行读入一个列表。

  4. 然后,我们遍历文件中的每一行。如果该行包含.o,则我们将其作为当前的.o文件。如果该行不包含|,则我们将其忽略。否则,我们将该行拆分成一个列表,并提取出函数的名称、类型和大小。

  5. 如果函数的类型是NOTYPE,则我们将函数的名称添加到notypeDict中。如果函数的类型是FUNC,则我们将函数的名称添加到funcDict中。

  6. 最后,我们打印出notypeDict和funcDict。

  7. 为了测试代码,我们调用find_dep_for_func()函数来查找__fixunsdfdi函数所依赖的所有.o文件。