0

你好,当一个人反汇编一些由 c 编译器编译的 win32 exe prog 时,它表明一些编译器在其中链接了一些“隐藏”的例程——我认为即使 c 程序是一个空的并且有 5 个字节左右。

我知道这样的 5 个字节包含在 PE .exe 格式中,但为什么要放置一些例程 - 这对我来说似乎没有必要,甚至有点让我烦恼。那是什么?可以省略吗?据我了解,c 程序(现在不是在谈论我知道有一些初始例程的 c++)不应该需要这种互补的隐藏函数。

很多 tnx 的答案,甚至可能是一些扩展的信息链接,因为这个话题让我很感兴趣

//编辑

好的,这是我当时做过的一些反汇编(数字火星和旧的 bo​​rland 命令行(我也已经测试过)都制作了更多的代码,(而且我对 bcc32 特别感兴趣)但它们在这种反汇编中不包含可读的名称/符号所以我不会在这里发布它们

这些是有点可读的——但我没有理解它是什么的经验;-)

https://dl.dropbox.com/u/42887985/prog_devcpp.htm

https://dl.dropbox.com/u/42887985/prog_lcc.htm

https://dl.dropbox.com/u/42887985/prog_mingw.htm

https://dl.dropbox.com/u/42887985/prog_pelles.htm

一些解释性评论这是什么?(恐怕这里可能有一些 c++ sh*t,虽然我对纯 c 插件而不是 c++ 感兴趣,但现在太累了,无法确保它是在 c 模式下编译的,编译后的 empty-main prog 的扩展是 c 所以我以为它将以c而不是c ++输出)

tnx 以获得更长的解释它是什么

4

3 回答 3

2

由于您的 win32 exe 文件是动态链接的目标文件,因此它将包含动态链接器完成其工作所需的必要数据,例如要链接到的库的名称和需要解析的符号。

即使是一个空的程序main()也会链接到 c-runtime 和 kernel32.dll 库(可能还有其他库? - 自从我上次做 Win32 开发以来已经有一段时间了)。

您还应该知道,这main()只是程序的入口点 - 在此之前已经进行了很多操作,例如检索和标记命令行、设置语言环境、创建stderr,stdin以及stdout设置其他机制c-runtime 库需要这样一个at_exit(). 同样,当您main()返回时,运行时会进行一些清理——至少需要调用内核来告诉它您已经完成了。

至于有没有必要?是的,除非您喜欢每次都编写自己的程序序言和尾声。如果你足够受虐,可能有一些方法可以编写最小的、静态链接的应用程序。

至于存储开销,你为什么这么着急?担心是不够的。

于 2012-08-16T19:45:58.637 回答
1

每当您在 Windows 上运行程序时,都会加载几个初始化函数。除其他外,这些函数调用您编写的 main() 函数 - 这就是为什么您需要 main() 或 WinMain() 函数来运行程序的原因。我不知道其他包含的功能。你有一些拆解展示吗?

于 2012-08-16T19:38:36.960 回答
1

您没有太多细节要继续,但我认为您所看到的大部分内容可能是您的编译器使用的特定 C 运行时库的例程。

例如,将有代码使其能够从入口点“main”运行,可移植可执行格式理解调用您在 C 程序中编写的 main(char ** args)。

于 2012-08-16T19:39:14.557 回答