gpt4 book ai didi

c++ - 段错误 : and the disassembly is different between objdump and gdb

转载 作者:可可西里 更新时间:2023-11-01 16:21:07 25 4
gpt4 key购买 nike

[深呼吸。]我们有一个使用 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 中的这个条件 block ,确实存在 vtable 布局不匹配:

#ifdef __WXDEBUG__
virtual void OnAssert(const wxChar *file,
int line,
const wxChar *cond,
const wxChar *msg);
#endif // __WXDEBUG__

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

关于c++ - 段错误 : and the disassembly is different between objdump and gdb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24830584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com