在 GDB - C++ 中反汇编重载成员函数
To get disassembly of an overloaded member function in GDB - C++
有多个库实现了特定的类 - 我不确定包含哪个库 - 我也没有制作文件。
我想通过研究类的成员方法的反汇编来直接在 GDB 中确认这一点。
如何在 GDB 中反汇编重载成员函数?
考虑这个测试:
struct Foo {
int Fn(int x) const { return x + 42; }
int Fn(void) const { return 24; }
};
int main()
{
Foo f;
return f.Fn() + f.Fn(1);
}
当使用调试信息编译时:
(gdb) info func Fn
All functions matching regular expression "Fn":
File t.cc:
int Foo::Fn() const;
int Foo::Fn(int) const;
(gdb) disas 'Foo::Fn(int) const'
Dump of assembler code for function Foo::Fn(int) const:
0x000000000040051e <+0>: push %rbp
0x000000000040051f <+1>: mov %rsp,%rbp
0x0000000000400522 <+4>: mov %rdi,-0x8(%rbp)
0x0000000000400526 <+8>: mov %esi,-0xc(%rbp)
0x0000000000400529 <+11>: mov -0xc(%rbp),%eax
0x000000000040052c <+14>: add $0x2a,%eax
0x000000000040052f <+17>: pop %rbp
0x0000000000400530 <+18>: retq
End of assembler dump.
在没有调试信息的情况下编译时:
(gdb) info func Fn
All functions matching regular expression "Fn":
Non-debugging symbols:
0x000000000040051e Foo::Fn(int) const
0x0000000000400532 Foo::Fn() const
(gdb) disas 'Foo::Fn() const'
Dump of assembler code for function _ZNK3Foo2FnEv:
0x0000000000400532 <+0>: push %rbp
0x0000000000400533 <+1>: mov %rsp,%rbp
0x0000000000400536 <+4>: mov %rdi,-0x8(%rbp)
0x000000000040053a <+8>: mov $0x18,%eax
0x000000000040053f <+13>: pop %rbp
0x0000000000400540 <+14>: retq
End of assembler dump.
如果可执行文件得到了调试数据,通常可以根据文件名进行检查。您的命令是
Ovreload 函数使用名称重整。从本质上讲,它们具有独特的名称。
但您实际上可以打印函数的地址,例如
p 'A::function(int, bool, bool)'
它会打印类似"$1= { bool(int, bool, bool(} ...."现在你应该使用反汇编命令:
disassemble $1
问题是,图书馆是静态的吗?如果它是一个共享库,那么您所需要的只是在可执行文件上使用ldd
实用程序来确定它使用哪个共享对象。
相关文章:
- C++ 中重载成员函数的问题
- 如何将重载成员函数作为参数传递?
- 在 GDB - C++ 中反汇编重载成员函数
- 重载'->'成员访问运算符
- 非虚拟重载成员函数
- 重载成员函数的成员函数指针
- 重载成员选择运算符
- 找不到 VS2010 重载成员函数
- 将重载+成员函数的结果发送到重载<<导致编译错误
- 在"着色器程序"中找不到 C++ 重载成员函数
- 为什么不从线程调用重载成员
- C++ 解释重载成员函数迭代器(int i = 0) 的构造"one liner":i(i) { };
- C++强制mem_fun选择一个特定的重载成员函数
- 具有重载成员函数的多线程处理
- 消除作为模板参数传递的重载成员函数指针的歧义
- 指向常量重载成员函数的指针
- 带有重载成员函数的C++std::mem_fn
- 如何在设计API时设计带有const和volatile的重载成员函数
- 递归重载"->"(成员访问)
- 重载成员函数访问元组和递归累加结果失败的原因