C 如何从ELF文件中反汇编的.text部分的行到源代码中相应的行

C 如何从ELF文件中反汇编的.text部分的行到源代码中相应的行,c,assembly,code-coverage,elf,dwarf,C,Assembly,Code Coverage,Elf,Dwarf,我正在尝试用Python创建一个行覆盖程序 目标是从设备上运行的测试中接收PC列表,并获取测试涵盖的设备FW功能、条件和线路的信息 如果有帮助的话,所述设备具有ARC处理器 我有ELF二进制文件和源代码(用C编写),但不能在这里共享(公司机密信息) 我已经获取了ELF文件,并成功地获得了.text节反汇编(本质上是程序的汇编代码) 我已经拆卸了设备的FW,因此我以这种方式拆卸了FW: PC:hex_操作码汇编_命令操作数 像这样: 0x100:7eff mov a、b 此外,使用Eli Bend

我正在尝试用Python创建一个行覆盖程序

目标是从设备上运行的测试中接收PC列表,并获取测试涵盖的设备FW功能、条件和线路的信息

如果有帮助的话,所述设备具有ARC处理器

我有ELF二进制文件和源代码(用C编写),但不能在这里共享(公司机密信息)

我已经获取了ELF文件,并成功地获得了.text节反汇编(本质上是程序的汇编代码)

我已经拆卸了设备的FW,因此我以这种方式拆卸了FW:

PC:hex_操作码汇编_命令操作数

像这样:

0x100:7eff mov a、b

此外,使用Eli Bendersky提供的pyelftools:

我已经设法获得了源文件和函数开头的行号,因此我设法将每个函数的汇编代码映射到源代码

使用函数中的高PC和低PC,我成功地将PC从测试日志链接到函数

但现在我一直在尝试将单个装配线映射到它们在C源代码中的位置

我知道为此我需要在DWARF中的.debug_行中阅读信息,但我不能完全理解它

我成功地遇到了这个问题:

他们说: Line+=Line base+(操作码-操作码base)%Line范围

我有所有的信息,除了线路和操作码

“线”是指功能上的起始线吗?(例如,如果“void func()”位于文件source.c第5行)上一行

通过“操作码”,这是汇编命令的主要操作码吗?或者完整的汇编命令操作码(如二进制表示中的0x7eff)是其他的吗?矮人信息中的其他操作码

据我所知,计算是十进制的,所以操作码必须转换成十进制

提前谢谢你的帮助

瓦迪姆

但现在我一直在尝试将单个装配线映射到它们在C源代码中的位置

你想要两样东西:

  • 使用调试信息构建固件。通常,您只需要将
    -g
    添加到所有现有的编译和链接行

    注意:不要删除任何优化标志,否则编译的代码将不再匹配您收集的覆盖率的二进制文件

    注意:如果构建过程运行剥离,则需要在剥离二进制文件之前保存二进制文件

  • 使用
    decode\u file\u line
    from将收集到的每个地址(PC)映射到文件、行对


  • 操作码是dwarf操作码,而不是程序集/机器码。很明显,无论你使用什么数字基,都没有什么可转换的。在您链接的wiki页面中有一个示例,它甚至为您指出了详细的规范。你可以做一个小的非机密程序来测试。这些是侏儒操作码吗:DW_LNE_set_address DW_LNS_advanced_line DW_LNS_copy等。我从调试行得到的。好的,明白了。我从DWARF中看到了标准和扩展的操作码编号,但找不到特殊操作码编号的来源。此外,“行”表示函数的开头,或代码F.e的前一行。如果函数像1。void main()2。{3.printf(“hello world”);4.}每次计算是否从第1行开始?或者将其添加到前一行?这只会让我进入函数(在“子程序”骰子条目中显式设置)。我需要进入代码中的特定行。关于构建固件,我会检查,谢谢。nvm,我想我已经了解了。lineprog.get_entries()可能是我需要的