【问题标题】:LLVM and visual studio .obj binary incompatibilityLLVM 和 Visual Studio .obj 二进制文件不兼容
【发布时间】:2011-06-13 11:17:01
【问题描述】:

有谁知道 LLVM 二进制兼容性是否计划用于 Visual Studio 编译的 .obj 和静态 .lib 文件? 现在我只能将 LLVM 制作的 .obj 文件与在运行时加载 DLL 的动态库链接(从 Visual Studio 编译)。

虽然两个编译器之间发生二进制兼容性的可能性很小,但有人知道为什么在一个平台的编译器之间实现这一点如此困难吗?

【问题讨论】:

  • 在我的实践中,clang .o 和其他库的链接程度与 ld 一样成功。特定于我的设置,我将 -m i386pep 与 ld 一起使用。除非 llvm 的 lld 将来超过 ABI 兼容性,否则恕我直言,这就是限制。

标签: visual-c++ llvm clang


【解决方案1】:

正如 Neil 已经说过的,兼容性包括调用约定、名称修改等。尽管这两个是最小的问题。 LLVM 已经知道所有特定于 Windows 的调用约定(stdcall、fastcall、thiscall),这就是为什么你可以从 .dll 调用东西的原因。

如果我们谈论 C++ 代码,那么主要问题是 C++ ABI:vtable 布局、rtti 实现等。clang 遵循 Itanium C++ ABI(例如 gcc 使用的),VCPP - 没有,所有这些不幸的是,没有证件。在这个方向上有一些工作正在进行,所以事情可能会明显开始工作。请注意,很可能某些部分永远不会被覆盖,例如win32 上基于 seh 的异常处理,因为它已获得专利。

与纯 C 代码的链接工作了很长时间,因此,您可以通过 C 存根/包装器解决这些与 C++ ABI 相关的问题。

【讨论】:

    【解决方案2】:

    除了调用约定、寄存器使用等,为了使 C++ 代码与二进制兼容,两个编译器必须使用相同的名称修饰方案。这些方案是专有的(因此 MS 不会公布其方案的细节),并且在任何情况下都处于不断变化的状态。

    【讨论】:

    • 我找到了 Microsoft 名称修改方案的文档(甚至在 Wikipedia 上),所以我不认为这是主要原因。我还没有调查是否可以使用命令行开关更改修改方案。我到家时会检查的。
    • @Andos 不是,这是主要原因之一。维基百科不是文档。
    • name mangling 是这里最小的问题,真的。主要问题是 C++ ABI 兼容性。
    • @Anton 因此我的介绍性短语 - “除此之外”。不,这不是“最小的问题”。
    • @Matthieu:MSVC 不必为 C++ 异常使用 SEH。他们有一个类似于 DWARF 的基于表的实现。此外,不是微软必须允许它。现在谁拥有 Borland 的 32 位 SEH 专利。
    猜你喜欢
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2011-03-14
    相关资源
    最近更新 更多