[深呼吸。] 我们有一个应用程序,使用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进行反汇编时,该偏移量不存在。)
class MyWidget { MyInt a; MyInt b; };
如果MyInt
有时被定义为32位整数类型,有时被定义为64位整数类型,则MyWidget::b
的偏移量将不同。 - Igor Tandetnik