gpt4 book ai didi

c++ - 当 C++11 应用程序使用非 C++11 库时返回值损坏

转载 作者:太空宇宙 更新时间:2023-11-04 12:02:15 25 4
gpt4 key购买 nike

我有一个没有使用 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

最佳答案

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

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

关于c++ - 当 C++11 应用程序使用非 C++11 库时返回值损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13656545/

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