使用Rust构建的DLL是否在运行时需要libgcc.dll?

时间:2014-09-26 17:02:13

标签: windows rust libgcc

如果我使用Rust language构建DLL,是否需要在运行时出现libgcc*.dll

一方面:

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

另一方面:

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

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

1 个答案:

答案 0 :(得分:8)

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 SDK安装或Visual Studio安装)。此工具链在编译或运行时不使用libgcc*.dll。由于此工具链使用普通的Windows链接器,因此您可以自由链接任何普通的Windows本机库。

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


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


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

  
    

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

  
     

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

     
    

如何避免使用标准库或其中的那些部分? (和/或你确切知道哪个符号?)

  
     

它涉及你的箱子根#[no_std];我认为the unsafe guide有更多。

     

正在运行nm -D | grep gcc向我显示__gc_personality_v0,然后就是:What is __gxx_personality_v0 for?,   所以看起来我们的堆栈展开实现依赖于此。

     
    

我似乎记得我已经看到一些RFC也会分裂标准库;我可以使用哪些部分而无需拉入libgcc?

  
     

是的, libcore 并不需要其中任何一项。   你放弃 libstd

另外,引用the unsafe guide的部分内容:

  

核心库(libcore)具有非常少的依赖性,并且比标准库(libstd)本身更便携。此外,核心库具有编写惯用和有效Rust代码所需的大部分必要功能。 (......)   其他库(如liballoc)为libcore添加了其他特定于平台的假设,但仍然比标准库本身更便携。

当前docs for unwind module的片段:

  

目前Rust使用libgcc提供的展开运行时。

(为了便于阅读,我们略微编辑了成绩单。但是,如果有人提供更好的格式化和更全面的内容,我会很乐意删除这个答案!)