你好, 当一个人反汇编一些由c编译器编译的win32 exe程序时 表明一些编译器在其中链接了一些“隐藏”例程 - 我认为即使 c 程序是一个空程序并且有 5 个字节左右。
我知道这 5 个字节是用 PE .exe 格式封装的,但是 为什么要放一些例程-对我来说似乎没有必要,甚至 有点让我烦恼。那是什么?可以省略吗?我认为 c 程序(现在不谈论 c++,我知道它有一些 初始例程)不应该需要这样的互补隐藏功能..
很多 tnx 的答案,甚至可能是一些扩展的信息链接,导致这个 我对这个话题很感兴趣
//编辑
好的,这是我以前做过的一些反汇编 (数字火星和旧的 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 语言编译的 模式,已编译的空主程序的扩展名是 c 所以我认为它会以 c 而不是 c++ 输出)
tnx 以获得更详细的解释
最佳答案
由于您的 win32 exe 文件是一个动态链接的目标文件,它将包含动态链接器完成其工作所需的必要数据,例如要链接到的库的名称和需要解析的符号。
即使是一个空的 main()
程序也会链接到 c-runtime 和 kernel32.dll 库(可能还有其他的?- 距离我上次做 Win32 dev 已经有一段时间了)。
您还应该知道 main()
只是您的 程序的入口点——在此之前已经进行了相当多的工作,例如检索和标记命令行,设置语言环境,创建 stderr
、stdin
和 stdout
并设置 c 运行时所需的其他机制at_exit()
这样的库。类似地,当您的 main()
返回时,运行时会进行一些清理 - 并且至少需要调用内核来告诉它您已完成。
至于有没有必要?是的,除非您喜欢每次都编写自己的程序序言和结语。如果您足够自虐,可能有一些方法可以编写最小的、静态链接的应用程序。
至于存储开销,您为何如此烦恼?担心还不够。
关于c - c程序中链接的隐藏例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11994075/