crt0 是否加载 msvcrt.dll

Does crt0 load msvcrt.dll?

本文关键字:dll msvcrt 加载 是否 crt0      更新时间:2023-10-16

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

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

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

总会有一个运行时环境,例如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 位置。

(关于你的英语:它比我一起工作的大多数工程师说的要好。

以下是一些与 C 运行时和标准库 (1,2,3( 相关的链接页面:

crt0.obj是CRT静态库(COFF存档(libcmt.lib的一部分。相反,您可以选择通过与 COFF 导入库 msvcrt.lib 静态链接来动态链接 CRT,这将导致在运行时与msvcr<version>.dll进行动态链接。

标准库是用libpcmt.lib实现的,动态版本是msvcprt.lib的,这将导致运行时与msvcp<version>.dll的动态链接。

我在VS2017上的libcmt.lib没有crt0.obj的对象文件存档成员,而是似乎在exe_main.obj中实现了mainCRTStartup,在exe_winmain.obj中实现了WinMainCRTStartup