【问题标题】:Any up-to-date references for replacing the MS CRT?有没有关于更换 MS CRT 的最新参考资料?
【发布时间】:2012-08-18 05:35:27
【问题描述】:

我使用了this 作为参考,但它似乎并不完整。当我设置/NODEFAULTLIB 时,我收到关于缺少__except_list__load_config_used 以及其他一些显然与SEH 相关的事情的链接器错误。将_CxxThrowException 和朋友正确链接很容易,但我不知道__except_list 应该是什么,也不知道从哪里开始寻找。

我同时使用 MSC 和 IC。使用 IC 时,链接器会报告 __except_list 缺失,但 MSC 并非如此。

对于那些最喜欢回答“为什么?”的人来说:这是因为我想知道它是如何工作的,而且我已经厌倦了毫无理由地开始使用 300kb 的无操作测试应用程序。

【问题讨论】:

  • 嗯,300kb 的“什么都不做”应用程序有 300kb,因为编译器不在乎它什么都不做。真正的应用程序会做一些事情,有时只是不值得玩魔术来阻止基本的核心功能被添加到“什么都不做”的应用程序中。是的,这不是答案,这就是我点击“添加评论”的原因:-)
  • 编译器不可避免地依赖于它的 CRT 实现。特别是对于异常处理,这是一个繁重的实现细节,每个供应商的做法都不同。写 C 以获得更好的效果。无论您最终得到什么,都将依赖于 CRT 和操作系统。当您通过使用共享版本的 CRT 获得 1 GB 的操作系统代码时,您不再担心 300 KB 的 CRT 代码。所以它是共享的,就像操作系统代码是共享的一样。您使用的两个编译器都支持这一点。
  • 我知道。由于这是个人项目的一部分,因此我主要希望在无需编写操作系统的情况下对程序的整个生命周期进行尽可能多的控制。

标签: c++ visual-studio msvcrt


【解决方案1】:

如果你想摆脱CRT 依赖,那么将/Zl 选项传递给编译器。链接器不需要任何特殊选项(编译器不会插入 /DEFAULTLIB:... 进入.drectve 部分,因此链接器不会将您的EXE 绑定到任何CRT)。 当然,您不应该在代码中使用C++ 异常或堆;或者您需要提供您自己的以assembly 语言编写的库函数版本。

【讨论】:

    【解决方案2】:

    链接器选项 /safeseh:no(查看 PE 图像信息中的 IMAGE_LOAD_CONFIG_DIRECTORY)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多