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

标签 c winapi compiler-construction linker

你好, 当一个人反汇编一些由c编译器编译的win32 exe程序时 表明一些编译器在其中链接了一些“隐藏”例程 - 我认为即使 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 语言编译的 模式,已编译的空主程序的扩展名是 c 所以我认为它会以 c 而不是 c++ 输出)

tnx 以获得更详细的解释

最佳答案

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

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

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

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

至于存储开销,您为何如此烦恼?担心还不够。

关于c - c程序中链接的隐藏例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11994075/

相关文章:

c++ - "child control"、 "child window"和 "child window control"之间有区别吗?

windows - 同步使用 GetWindowText

java - 如何限制那个子类不能泛型?

java - "someString"相当于新字符串 ("someString"吗?在java中

c - 为什么设置 LINKOPTS =' ' 抑制错误消息

java - 使用java native 接口(interface)获取Windows当前用户

c++ - 为 ARM mbed 编译 PicoTCP 时未定义对 pico_dhcp_server_initiate 的引用

compiler-construction - 单一静态赋值形式的全局变量

c - arr[0] = arr[1] = C 中的值是不好的做法吗?

c - 写入系统调用参数寄存器