Rust构建的DLL在运行时需要libgcc.dll吗?

6
如果我使用Rust语言构建一个DLL,它是否需要在运行时存在libgcc*.dll
一方面:
- 我在互联网上看到过一篇文章声称需要; - rustc.exe在其目录中有libgcc_s_dw2-1.dll,当从http://crates.io网站下载时,cargo.exe将无法运行。
另一方面:
- 我看过用Rust构建玩具操作系统内核的文章,因此它们肯定不需要libgcc动态库。
所以,我很困惑。什么是明确的答案?
1个回答

10
Rust为Windows提供了两个主要的工具链:x86_64-pc-windows-gnux86_64-pc-windows-msvc-gnu 工具链包括一个msys环境,并使用GCC的ld.exe链接目标文件。这个工具链需要在运行时存在libgcc*.dll。这个工具链的主要优势在于它允许您链接其他msys提供的库,这可以使您更容易地链接某些难以在普通Windows环境下完成的C/C++库。 -msvc 工具链使用标准、本地的Windows开发工具(安装Windows SDKVisual Studio)。这个工具链在编译时和运行时都不使用libgcc*.dll。由于这个工具链使用普通的windows链接器,因此您可以自由地链接任何普通的Windows本机库。
如果您需要针对32位Windows,这两个工具链的i686-变体也是可用的。
注意:以下答案总结了截至2014年9月的情况;我不知道现在是否仍然如此,或者自那时以来情况是否有所好转或恶化。但我强烈怀疑事情已经发生了变化,因为已经过去了两年。如果有人试图再次询问steveklabnik然后更新下面的信息或编写新的、更新鲜的答案,那将很酷!
以下是与steveklabnik进行的Rust IRC聊天的快速原始转录,他给了我一种答案:
如果你使用标准库,那么我认为它确实需要;我记得我们依赖它的一个符号,但我不确定。

如何避免使用标准库或其中的某些部分?(或者你知道具体是哪个符号吗?)

在您的箱根使用 #[no_std];我认为不安全指南有更多信息。

运行nm -D | grep gcc向我显示__gc_personality_v0,然后还有这个:What is __gxx_personality_v0 for?,所以我们的堆栈展开实现似乎依赖于那个符号。

我好像记得看到过一些RFC将标准库拆分的内容;有没有部分可以使用而不需要引入libgcc?

是的,libcore不需要任何东西。您放弃了libstd

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

核心库(libcore)的依赖很少,比标准库(libstd)本身更具移植性。此外,核心库具有编写 Rust 代码的大多数必要功能。(...) 进一步的库,如liballoc,为libcore添加了功能,这些功能使其他平台特定的假设,但仍然比标准库本身更具可移植性。

以及当前取消模块文档的片段:

目前Rust使用由libgcc提供的取消运行时(unwind runtime)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接