【问题标题】:Does crt0 load msvcrt.dll?crt0 是否加载 msvcrt.dll?
【发布时间】:2014-05-30 09:02:49
【问题描述】:

我试图弄清楚像 printf() 这样的标准 C 函数是如何在 Windows 环境中加载到内存中的。 我知道crt0.obj 准备堆栈,调用int main(int argc, char **argv),然后使用main 返回的退出代码退出进程。

我还听说 C 标准函数位于一个名为 msvcrt.dll 的共享库中。我想知道 crt0 是否也加载 msvcrt.dll 或者有一个 msvcrt.lib 也由编译器自动链接。

谢谢你,对不起我的英语:)

【问题讨论】:

  • 另外,我建议您获取 (1) Process Monitor 和 (2) Depends 的副本,并学习如何同时使用它们。它们都非常适合回答像您这样的问题。他们是免费的。
  • 我没有仔细检查过,但我相信 crt0.obj 是 msvcrtnn.dll 的一部分。

标签: c++ c windows dll operating-system


【解决方案1】:

这里有一些关于 C 运行时和标准库 (1,2,3) 的链接的好页面:

crt0.objlibcmt.lib 的一部分,它是 CRT 静态库 (COFF archive)。您可以改为通过静态链接到 COFF 导入库 msvcrt.lib 来选择动态链接 CRT,这将导致在运行时与 msvcr<version>.dll 进行动态链接。

标准库在libpcmt.lib中实现,动态版本为msvcprt.lib,会导致在运行时与msvcp<version>.dll动态链接。

我在 VS2017 上的 libcmt.lib 没有 crt0.obj 对象文件存档成员,而是在 exe_main.objexe_winmain.obj 中实现 mainCRTStartupWinMainCRTStartup

【讨论】:

    【解决方案2】:

    总会有一个运行时环境,例如 msvcr80.dll(适用于 Windows 变体),在您安装环境时加载,无论它是什么,即 MSVCxx、Code::Blocks with MinGW 等。安装程序将包含标准 C 库(用于 C 环境)的 .dll 放入您的系统目录,并提供所有必要的静态库以在构建期间链接到,以及原型的头文件和使用该环境所需的定义。您只需要在源代码中设置路径(查看.libs)和#include 正确的标题。

    注意,对于 Linux 等操作系统,运行时环境内置于操作系统中,包括所有共享库(与 .dll 同义)静态库和标准 C 的 .h。

    关于您对 msvcrt.dll 的问题,请阅读上面@Eric 的评论。 Microsoft 的当前 RTE 使用 msvcrnnn.dll 形式的命名约定(例如 msvcr80.dll、msvcr100.dll 等,具体取决于寻址(32 位或 64 位)、操作系统版本等)

    关于您的声明:也由编译器自动链接。 这完全取决于环境。如果您使用的是 Microsoft 的开发环境,那么是的,它可能已经设置了默认值,以允许您的链接开箱即用。如果使用 Microsoft 库,但来自非 Microsoft 环境,则需要设置路径和其他环境变量才能获取 .lib 和 .h 位置。

    (关于你的英语:比我工作的大多数工程师说的都好。)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多