我注意到mingw在调用main()之前添加了很多代码,我假设它用于解析命令行参数,因为其中一个函数被称为__getmainargs(),并且还有很多字符串被添加到最终的可执行文件中,例如mingwm.dll和一些错误字符串(包括应用程序崩溃)说mingw运行时错误或类似的东西。
我的问题是:有没有办法删除所有这些东西?我不需要所有这些东西,我尝试了tcc(微小的c编译器)它完成了这项工作。但不像gcc(solaris / mac)那样跨平台
任何想法?
感谢。
答案 0 :(得分:5)
是的,你真的做需要所有这些东西。它们是代码运行的C环境的启动和拆卸代码。
除了低级嵌入式解决方案等非托管环境之外,你会发现所有 C环境都有类似的东西。类似于UNIX的操作系统中的/lib/crt0.o
或Windows下的crt0.obj
。
它们对于成功运行代码至关重要。您可以自由省略不使用的库函数(printf
,abs
等),但需要启动代码。
它可能执行的一些事情是atexit
结构的初始化,参数解析,C运行时库的结构初始化,C / C ++预主值的初始化和等等。
它是高度特定于操作系统的,如果有你不想做的事情,你可能必须得到它的源代码并将它们取出,实质上是为你提供自己的减少替代品。对象文件。
答案 1 :(得分:1)
您可以放心地假设您的工具链不包含不所需的代码,并且可以安全地被遗漏。
确保编译时没有调试信息,并在生成的可执行文件上运行strip
。任何比这更具侵入性的东西都需要对你的工具链有深入的了解,并且可能导致很难调试的相当奇怪的行为 - 也就是说,如果你不得不问如何做到这一点,你就不应该尝试这样做。 p>