相关疑难解决方法(0)

如何从GCC /铿锵声组件输出中消除"噪音"?

我想检查boost::variant在我的代码中应用的程序集输出,以便查看哪些中间调用被优化掉了.

当我编译以下示例(使用GCC 5.3 g++ -O3 -std=c++14 -S)时,似乎编译器优化了所有内容并直接返回100:

(...)
main:
.LFB9320:
    .cfi_startproc
    movl    $100, %eax
    ret
    .cfi_endproc
(...)
Run Code Online (Sandbox Code Playgroud)
#include <boost/variant.hpp>

struct Foo
{
    int get() { return 100; }
};

struct Bar
{
    int get() { return 999; }
};

using Variant = boost::variant<Foo, Bar>;


int run(Variant v)
{
    return boost::apply_visitor([](auto& x){return x.get();}, v);
}
int main()
{
    Foo f;
    return run(f);
}
Run Code Online (Sandbox Code Playgroud)

但是,完整的程序集输出包含的内容远远超过上面的摘录,对我而言,它看起来永远不会被调用.有没有办法告诉GCC/clang删除所有"噪音"并输出程序运行时实际调用的内容?


完整装配输出:

    .file   "main1.cpp"
    .section    .rodata.str1.8,"aMS",@progbits,1
    .align 8
.LC0:
    .string "/opt/boost/include/boost/variant/detail/forced_return.hpp"
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC1: …
Run Code Online (Sandbox Code Playgroud)

c++ assembly gcc clang

56
推荐指数
3
解决办法
1万
查看次数

如何反汇编,修改然后重新组装Linux可执行文件?

无论如何这可以做到吗?我已经使用了objdump但是这不会产生任何我知道的汇编程序可以接受的汇编输出.我希望能够在可执行文件中更改指令,然后再对其进行测试.

linux x86 objdump disassembly

48
推荐指数
4
解决办法
2万
查看次数

反汇编的gcc输出似乎执行"调用0"而不是"调用函数偏移",但工作正常

我只看了一下我从这个C程序得到的一个非常简单的SPARC程序集输出:

int addition_func(int a, int b)
{
  return(a+b);
}

void main()
{

int a = 20;
int b = 19;
int res;    

res = addition_func(a, b);
}
Run Code Online (Sandbox Code Playgroud)

反汇编.text:

00000000 <addition_func>:
 0: 81 c3 e0 08     retl 
 4: 90 02 00 09     add  %o0, %o1, %o0

00000008 <main>:
 8: 90 10 20 14     mov  0x14, %o0
 c: 92 10 20 13     mov  0x13, %o1
10: 82 13 c0 00     mov  %o7, %g1
14: 40 00 00 00     call  14 <main+0xc>
18: …
Run Code Online (Sandbox Code Playgroud)

assembly sparc disassembly

5
推荐指数
1
解决办法
883
查看次数

比终端+objdump 更好的方法来读取程序集?

例如,如果我在,perf report我可以按 Enter 键跟随分支。如果垃圾箱正在使用-g某些来源也会显示。

我真的不需要源代码,但如果我可以跟随跳转,那就非常方便了。我该怎么做才能使阅读汇编变得更容易?由于我在 Linux 上,所以我最终运行了 perf 并使用报告来阅读此内容

assembly disassembly

5
推荐指数
1
解决办法
888
查看次数

如何在 C 中将 .o 文件转换回 .c 文件?

我确信有办法。我是 C 语言的新手,我对此的研究毫无结果。有没有可以将 .o 文件转换为 .c 的命令?

c gcc compilation

2
推荐指数
1
解决办法
3万
查看次数

标签 统计

assembly ×3

disassembly ×3

gcc ×2

c ×1

c++ ×1

clang ×1

compilation ×1

linux ×1

objdump ×1

sparc ×1

x86 ×1