如何使用objdump在高度优化的对象文件中交错源代码
How to use objdump to interleave source code in highly optimized object file?
我有一个经过高度优化编译的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大约是你能达到的最高值。
相关文章:
- 如何在源代码中包含外部库的头文件?
- 是否有可能使用debug_info获取ELF文件的源代码?
- Linux 源代码中普通磁盘文件的"轮询"功能在哪里实现?
- 相同的源代码,不同的可执行文件大小?
- 尝试使用 MSVC 从源代码构建 qt 创建器:无法打开包含文件:"stddef.h":没有这样的文件或目录
- 使用dll源代码C++调试dll文件
- 在Linux Mint 19下,从哪里提取wxWidgets的源代码(.cpp文件)用于步骤内部调试
- 在发送源代码时省略未使用的boost src文件的策略
- 如何使用curl c ++源代码发布wav文件数据,如何使用c ++使用--data-binary?
- 使用 bazel 构建的二进制文件在 pprof 中查看源代码
- 更改 Cmake 文件以从源代码编译依赖项,而不是使用 FIND_PACKAGE
- 如何从 Makefile 中的其他目录导入所有源代码和头文件
- 当外部源代码中发生异常时,无法正确使用自创建的小型转储文件的堆栈跟踪
- C++ 源代码的递归生成文件
- C++20 是否要求将源代码存储在文件中?
- 生成文件:为每个包含的标头自动编译源代码
- 从源代码编译 openCV:*** 未指定目标,也未找到生成文件.停
- 为什么将函数体放置在单独的源代码文件而不是标题中的C/C 中
- 如何将C 源代码存储在可执行文件中
- 如何在project.pro呼叫中从带源代码的嵌套文件夹中制作文件