1

我有一个在没有 C++11 标志 (-std=c++11) 的情况下编译的库和一个链接到使用 -std=c++11 构建的库的应用程序。它调用库中的一个函数,然后程序在库中崩溃得更深。我发现发生崩溃的函数(它只是一个返回类中的指针的简单函数)的反汇编在调用堆栈源自该程序时与库的测试程序不同,后者也是'不是用 C++11 标志构建的。

操作系统是 OS X Mountain Lion,编译器是 Clang++。

为什么 C++11 应用程序和非 C++11 库之间没有能力,以及当不同的生成代码在库中时何时生成反汇编,因此应该是相同的?

两种不同的反汇编:

TestApplication`Core::GetPointer() const at System.h:xxx:
0x100009690:  pushq  %rbp
0x100009691:  movq   %rsp, %rbp
0x100009694:  movq   %rdi, -8(%rbp)
0x100009698:  movq   -8(%rbp), %rdi
0x10000969c:  movq   64(%rdi), %rax  ;<-------Difference
0x1000096a0:  popq   %rbp
0x1000096a1:  ret    

Lib1Prototype`Core::GetPointer() const at System.h:xxx:
0x100019c10:  pushq  %rbp
0x100019c11:  movq   %rsp, %rbp
0x100019c14:  movq   %rdi, -8(%rbp)
0x100019c18:  movq   -8(%rbp), %rdi
0x100019c1c:  movq   40(%rdi), %rax  ;<------Difference
0x100019c20:  popq   %rbp
0x100019c21:  ret    
4

1 回答 1

1

在 OS X 使用的 x86-64 ABI 中,传入函数的第一个参数,传入%rdi函数的返回值%rax。* 所以这个函数接受一个指向某个数据结构的指针,并返回包含的 64 位值从偏移量 64 或 40 开始,具体取决于函数的编译方式。

因此,您需要查看定义该数据结构的头文件。它根据您是否编译为 C++11 来定义不同的数据结构。也许有一些明显的东西,比如#ifdef你知道的定义不同。或者也许有一个成员的类型定义不同。如果您无法弄清楚,请编辑您的问题并粘贴(通过指针)传递给Core::GetPointer函数的数据结构的定义。

于 2012-12-01T05:30:51.703 回答