c – Segfault:objdump和gdb之间的反汇编有所不同

前端之家收集整理的这篇文章主要介绍了c – Segfault:objdump和gdb之间的反汇编有所不同前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
[深呼吸.]
我们有一个使用WxMotif 2.6.3弹出窗口的应用程序(GUI库不是 – 而不是我的选择).
它在32位ix86系统上运行良好.我将任务转换为64位应用程序.它总是断层.
我在RHEL 6,所以我编译使用 gcc 4.4.7.经过很多磨牙,问题似乎很明显:在wxFrame :: DoCreate中,m_mainWidget设置(正确);在wxFrame :: GetMainWidget中,它作为空指针返回.空指针导致崩溃.
使用gdb,设置m_mainWidget的指令是
mov    %rax,0x1e0(%rdx) # $rdx = 0x68b2f0

而m_mainWidget的代码

mov    0x1f0(%rax),%rax # $rax = 0x68b2f0

在gdb中,我可以检查内存,看看0x68b4d0的指针是否正确.为什么偏移不正确?

为了混淆更多的东西,当我使用objdump来反汇编libwx_motifd_core-2.6.so.0.3.1时,“get”程序集是

mov    0x1e0(%rax),%rax

在objdump中,get和set都使用0x1e0作为偏移量.到底是怎么回事?

我在这里上传了一些相关信息:
GitHub

我已经包括一个小程序来复制我的系统上的问题.

进一步调查,我看到在wxFrame :: DoCreate的反汇编,进一步使用m_mainWidget检索值使用0x1e0作为偏移量(反汇编在编译时使用-O0,所以代码必须回到内存每一次).
“只是为了乐趣”,我添加了一个新的成员变量到wxFrame – m_myMainWidget – 并设置在m_mainWidget设置后.然后我有wxFrame :: GetMainWidget()返回本地值(m_myMainWidget).你不会知道的:当我从gdb中拆卸时,崩溃仍然发生,GetMainWidget包含相同的16个偏移量. (偏移不在那里我使用objdump来反汇编.)

解决方法

基于@ Igor的评论,我使用-fdump-class-hierarchy编译器选项查看了类布局.事实证明,由于include / wx / app.h中的这个条件块,确实存在一个vtable布局不匹配:
#ifdef __WXDEBUG__
    virtual void OnAssert(const wxChar *file,int line,const wxChar *cond,const wxChar *msg);
#endif // __WXDEBUG__

您需要确保使用相同的__WXDEBUG__设置编译代码.

猜你在找的C&C++相关文章