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

时间:2011-02-14 02:27:42

标签: c gcc mingw

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

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

任何想法?

感谢。

2 个答案:

答案 0 :(得分:5)

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

除了低级嵌入式解决方案等非托管环境之外,你会发现所有 C环境都有类似的东西。类似于UNIX的操作系统中的/lib/crt0.o或Windows下的crt0.obj

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


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

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

答案 1 :(得分:1)

您可以放心地假设您的工具链不包含所需的代码,并且可以安全地被遗漏。

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