在c程序中链接的隐藏例程

时间:2012-08-16 19:23:39

标签: c winapi compiler-construction linker

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

据我所知,这5个字节以PE .exe格式封装,但是 为什么要做一些例程 - 对我来说似乎没有必要 有点让我烦恼那是什么?可以省略吗?我认为 c程序(现在不是说c ++,我知道有一些 初始例程)不应该需要这种互补的隐藏函数。

答案很多,甚至可能是一些扩展信息链接,导致这个问题 话题让我很感兴趣

//修改

好的,这是我当时做过的一些麻烦 (数字火星和旧的borland命令行(我也测试了) 两者都做了更多的代码,(我特别感兴趣的是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更长的解释是什么

3 个答案:

答案 0 :(得分:2)

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

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

你还应该知道main()只是你的程序的入口点 - 在这一点之前已经有了很多,例如检索和标记命令行,设置区域设置,创建stderrstdinstdout,并设置c-runtime库所需的其他机制,例如at_exit()。类似地,当你的main()返回时,运行时会进行一些清理 - 并且至少需要调用内核来告诉它你已经完成了。

至于是否有必要?是的,除非你喜欢每次都写自己的节目序言和结语。如果你有足够的自虐,可能有办法编写最小的,静态链接的应用程序。

至于存储开销,你为什么这么努力?担心这还不够。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

例如,将有一些代码使它能够从入口点'main'运行,便携式可执行格式可以理解为调用你在C程序中编写的main(char ** args)。