从gcc和mingw中删除不需要的代码

我注意到mingw在调用main()之前添加了很多代码,我假设它用于解析命令行参数,因为其中一个函数被称为__getmainargs(),并且还有很多字符串被添加到最终的可执行文件中,例如mingwm.dll和一些错误字符串(包括应用程序崩溃)说mingw运行时错误或类似的东西。

我的问题是:有没有办法删除所有这些东西? 我不需要所有这些东西,我尝试了tcc(微小的c编译器)它完成了这项工作。 但不像gcc那样跨平台(solaris / mac)

有任何想法吗?

谢谢。

是的,你确实需要所有这些东西。 它们是代码运行的C环境的启动和拆卸代码。

除了低级嵌入式解决方案之类的非托管环境之外,您会发现几乎所有 C环境都具有类似的function。 像某些类UNIX操作系统下的/lib/crt0.o或Windows下的crt0.obj

它们对于成功运行代码至关重要。 您可以自由省略不使用的库函数( printfabs等),但需要启动代码。


它可能执行的一些事情是atexit结构的初始化,参数解析,C运行时库的结构初始化,C / C ++ pre-main值的初始化等等。

它是高度特定于操作系统的,如果有你不想做的事情,你可能必须得到它的源代码并将它们拿出来,实质上是为目标文件提供你自己的减少替换。

您可以放心地假设您的工具链不包含不需要的代码, 可以安全地省略。

确保编译时没有调试信息,并在生成的可执行文件上运行strip 。 任何比这更具侵入性的东西都需要对你的工具链有深入的了解,并且可能导致很难调试的相当奇怪的行为 – 也就是说,如果你不得不问如何做到这一点,你就不应该尝试去做。