我正在尝试用Python创建一个行覆盖程序。
目标是从在设备上运行的测试接收PC列表,并获得所述设备的固件的哪些功能、条件和线路被测试覆盖的信息。
所述设备具有ARC处理器,如果这有帮助的话。
我有ELF二进制文件和源代码(用C编写),但不能在这里分享它们(公司机密信息)。
我已经获取了ELF文件,并设法获得了.text段的反汇编(本质上是程序的汇编代码)。
我已经拆卸了设备的FW,所以我以这种方式拆卸了FW:
PC: hex_opcode assembly_command操作数
如下所示:
0x100: 7effmov a,b
另外,使用来自Eli Bendersky的pyelftools:https://github.com/eliben/pyelftools
我已经设法获得了源文件和函数开头的行号,因此我已经设法将每个函数的汇编代码映射到source。
从函数中使用High PC和Low PC,我已经成功地将PC从测试日志链接到函数。
但是现在我被卡住了,试图将单个装配线映射到它们在C源代码中的位置。
我知道我需要在DWARF中阅读.debug_line中的信息,但我不太理解它。
我成功地发现了这一点:
他们说: Line += Line base +(操作码-操作码基础)%行范围
我有除Line和Opcode之外的所有信息。
所谓“行”,是指函数的起始行吗?(f.e.如果"void func()“位于文件Soure.c第5行)上一行?
" opcode“是汇编命令的主要操作码吗?或者是完整的汇编命令操作码(如二进制表示中的0x7efff)?来自DWARF info的其他操作码?
根据我的理解,计算是以十进制完成的,所以操作码必须转换为十进制。
提前感谢你的帮助。
瓦迪姆
发布于 2020-04-22 23:10:47
,但是现在我被卡住了,试图将单个装配线映射到它们在C源代码中的位置。
你想要两样东西:
-g添加到所有现有的编译和链接行中。注意:不要删除任何优化标志,否则编译后的代码将不再与您为其收集覆盖率的二进制代码相匹配。
注意:如果您的构建过程运行strip,则需要在剥离之前保存二进制文件。
decode_file_line将您收集的每个地址(PC)映射到文件,行对。https://stackoverflow.com/questions/61359930
复制相似问题