如何使用objdump在高度优化的对象文件中交错源代码

How to use objdump to interleave source code in highly optimized object file?

本文关键字:文件 源代码 对象 objdump 何使用 高度 优化      更新时间:2023-10-16

我有一个经过高度优化编译的C++对象文件(使用g++编译,指定-O3 -g -march=amdfam10 -Wall),其中包含调试信息。

我正在使用objdump -S "objname"

不幸的是,交错源代码似乎不起作用,因为有时我会看到同一组行(不仅仅是一行)重复,不仅仅是一个代码行,而是多个代码行多次重复,然后是只有一个汇编行,然后是其他3/4的源代码行,这没有多大意义。

例如,我看到3/4个带有迭代器的C++代码行,并且映射初始化后只有1/2个ASM行?这有道理吗?

知道可能会发生什么吗?

优化的代码(尤其是在O3开启积极优化的情况下)不再与源代码直接对应。例如,编译器通常会消除变量,因为值不需要存储在内存中,只需要存储在寄存器中。它还将重新排序操作,使它们更快。例如,一个简单的优化是将循环内的条件转换为在两个不同循环之间进行选择的条件,从而实现类似的功能

while(1){
    if(foo){
        bar();
    } else {
        baz();
    }
}

变成类似的东西

if(foo){
    while(1){
        bar();
    }
} else {
    while(1){
        baz();
    }
}

这是等效的,但避免了在每次迭代中进行比较。

如果你想看到与源代码的直接对应关系,O1大约是你能达到的最高值。