c - Win32、WinMain 与自定义入口点(大小差异巨大),为什么?

标签 c winapi

正如主题所说。

我注意到,如果我使用 WinMain 或任何其他默认入口点,C 应用程序可能约为 70kb。

但是如果我只是指定一个自定义入口点,比如“RawMain”,int RawMain()。 那么文件大约是6kb。

所以我想知道这是为什么,它添加/引用了文件什么? 我可以理解尺寸上存在一些微小差异,但对于空应用程序来说差异巨大。

谢谢!

最佳答案

在大多数环境中为 Windows 构建时,实际的程序入口点将由小型运行时库中的函数提供。那会做一些环境准备,然后调用你提供的一个函数,比如main、wmain、WinMain等。

在用户提供的 main 函数之前运行的代码包括运行全局 C++ 构造函数、启用 TLS 变量、初始化全局互斥体以便标准库调用在多线程环境中正常工作、设置标准区域设置以及其他内容。

设置入口点所做的一件事是使用 undefined symbol 和您为入口点指定的名称启动链接器,因此,例如,如果您使用 mingw32,链接器将开始假设它需要链接 libmingw32.a 并带有 undefined symbol __tmainCRTStartup

链接器将在 libmingw32.a 中找到(希望)__tmainCRTStartup,并包含包含它的目标文件 crtexe.o 以及以及满足来自 crtexe.o 的 undefined symbol 所需的任何其他内容,这就是额外大小的来源。

当您设置自己的入口点时,您可以覆盖它,并且只需设置链接器来查找您指定的任何函数。您将获得较小的可执行文件,但必须小心,您使用的功能不依赖于运行时的启动函数完成的任何全局初始化。

关于c - Win32、WinMain 与自定义入口点(大小差异巨大),为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42059629/

相关文章:

c - 使用数组作为 C 递归方法的输入

winapi - syscall.LoadDLL() 在除一台计算机外的所有计算机上均失败;我该怎么办?

C : write() fails while writing to a RAW disk after specific size limit reached

C 语言 以二进制方式访问内存

c - 使用函数指针时的返回值(也使用 OpenMP)

windows - 如何确定文件的碎片化程度?

windows - 是否可以在进程之间跟踪 PostMessage?

c++ - 您使用哪个命令在 Visual Studio 2010 (c++) 中调用 .exe

C++如何删除垂直滚动条?

c - 最小素数生成器 C