【发布时间】:2012-12-01 05:06:07
【问题描述】:
我有一个在没有 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
【问题讨论】:
-
那么,该库是否在其接口中公开了标准库的任何部分?有C接口吗?
-
这是一个非常大的库,有一个很大的接口,所以我没有审查每个函数签名,但它似乎确实避免在其公共接口中暴露标准库,但它肯定在内部使用它(标题包含私有矢量和地图)。它的接口是C++。
标签: c++ macos c++11 shared-libraries clang