【问题标题】:removing unneeded code from gcc andd mingw从 gcc 和 mingw 中删除不需要的代码
【发布时间】:2011-02-14 02:27:42
【问题描述】:

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

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

有什么想法吗?

谢谢。

【问题讨论】:

  • 您要解决的实际问题是什么?如果是我,我可能会让它成为它想要的样子。

标签: c gcc mingw


【解决方案1】:

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

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

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


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

它是高度特定于操作系统的,如果有一些您不想做的事情,您可能必须获取它的源代码并将它们取出,实质上是提供您自己的精简替代品目标文件。

【讨论】:

  • 如果我要使用 argc 和 argv 就需要它,但实际上我不会,所以我想删除这部分。
  • @killercode,参数解析是它所做的之一。它可能做的更多。查看我的更新。
【解决方案2】:

您可以放心地假设您的工具链不包含不需要需要并且可以安全地被排除在外的代码。

确保在没有调试信息的情况下进行编译,并在生成的可执行文件上运行 strip。任何比这更具侵入性的东西都需要对您的工具链有深入的了解,并且可能导致难以调试的相当奇怪的行为 - 即,如果您必须询问如何完成它,您不应该尝试这样做。

【讨论】:

  • 抱歉回复晚了,但正如我所指出的,微型 c 编译器生成我只编写的代码,不像 gcc,它添加代码来解析 argc 和 argv 的命令行参数,我真的不需要它们,所以我想知道是否有办法在没有这些的情况下生成 exe,ty。
  • 如果 Tiny C 编译器不生成该代码,则您正在使用不同的选项集进行编译(类似于 GCC 的 -ffreestanding)。但是,除非您确切地知道自己在做什么,否则这将导致生成的二进制文件对您没有任何帮助。 (例如,它甚至不会启动。)
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多