6

如果我用Rust 语言构建 DLL ,它是否需要libgcc*.dll在运行时出现?

一方面:

  • 我在互联网上的某个地方看到过一个帖子,声称是的。
  • rustc.exelibgcc_s_dw2-1.dll它的目录下,从http://crates.io网站cargo.exe下载时没有 dll 将无法运行;

另一方面:

  • 我看过关于在 Rust 中构建玩具操作系统内核的文章,所以它们肯定不需要存在 libgcc 动态库。

所以,我很困惑。确定的答案是什么?

4

1 回答 1

10

Rust 为 Windows 提供了两个主要的工具链:x86_64-pc-windows-gnux86_64-pc-windows-msvc.

-gnu工具链包括一个环境并使用msysGCCld.exe来链接目标文件。此工具链需要libgcc*.dll在运行时存在。这个工具链的主要优点是它允许您链接到其他msys提供的库,这可以更容易地链接到在正常 Windows 环境下难以链接的某些 C\C++ 库。

工具链使用标准的-msvc原生 Windows 开发工具(Windows SDK安装或Visual Studio安装)。此工具链libgcc*.dll在编译或运行时均不使用。由于此工具链使用普通的 Windows 链接器,因此您可以自由链接任何普通的 Windows 本机库。

如果您需要针对 32 位 Windows,i686-可以使用这两个工具链的变体。


注意:以下答案总结了截至2014年 9 月的情况;我不知道它是否仍然是最新的,或者从那时起事情是否变得更好或更糟。但我强烈怀疑事情已经发生了变化,因为从那时起已经过去了 2 年。如果有人试图再次向 steveklabnik 询问这件事,那会很酷,然后更新下面的信息,或者写一个新的、更新鲜的答案!


与 steveklabnik 的 Rust IRC 聊天的快速原始记录,他给了我一种答案:

你好; 我有一个问题:如果我用 Rust 构建一个 DLL,它是否需要 libgcc*.dll 在运行时出现?(在 Windows 上)

相信如果您使用标准库,那么它确实需要它;IIRC 我们依赖其中的一个符号;但我不确定。

我怎样才能避免使用标准库,或者它的那些部分呢?(和/或您确切知道哪个符号?)

它涉及您的箱子根目录中的#[no_std];我认为不安全的指南有更多。

运行nm -D | grep gcc显示我__gc_personality_v0,然后是这样的:__gxx_personality_v0 是做什么用的?,所以看起来我们的堆栈展开实现依赖于此。

我似乎记得我也看过一些 RFC 以拆分标准库的效果;有没有我可以在不拉入 libgcc 的情况下使用的部分?

是的,libcore不需要任何这些。你放弃libstd

此外,引用不安全指南的部分内容:

核心库 (libcore) 的依赖项非常少,并且比标准库 (libstd) 本身更具可移植性。此外,核心库具有编写惯用且有效的 Rust 代码所需的大部分功能。(...) 其他库,例如 liballoc,向 libcore 添加了功能,这些功能做出了其他特定于平台的假设,但仍然比标准库本身更具可移植性。

以及展开模块的当前文档片段:

目前 Rust 使用 libgcc 提供的 unwind runtime。

(为了便于阅读,对成绩单进行了轻微编辑。不过,如果有人提供格式更好、更彻底的内容,我会很乐意删除这个答案!)

于 2014-09-26T17:26:11.967 回答