2012-08-16 80 views
0

你好, 当一个disasembly用C编译器来编译一些Win32的EXE前卫它 显示链接,一些编译器在它连接的一些“隐藏”的套路 - 我想就算C程序是一个空和有5个字节左右。隐藏的程序在C程序

据我所知,这5个字节是以PE .exe格式封装的,但是为什么要放一些例程 - 对我来说似乎没有必要,甚至有些让我恼火。那是什么?它可以被省略吗?据我了解 C程序(不谈论C++,现在我知道有一些 开始子程序)不应该需要这样的互补隐藏功能..

大部分TNX的答案,甚至一些扩展信息链接,导致此 话题兴趣我很多

//编辑

确定这里是一些disasembly香港专业教育学院做了归途然后 (数字火星老Borland的命令行(我也测试) 都使更多的代码,(和Im特别对bcc32感兴趣) 但他们不包括这样的可读名称/符号dissassembly 所以我不会张贴在这里

thesse有些可读 - 但我并不understending 经历是什么;-)

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

一些解释性评论什么是heere? (我恐怕也许这里有一些C++ sh * t,我对纯c的插件并不感兴趣c,但是现在太累了,现在已经太累了,以至于不能确保它编译为c 模式,编译后的empty-main prog的扩展名为:C 所以我想这将是在C不是C++输出)

TNX更长说明它是什么

回答

2

由于您的win32 exe文件是动态链接的目标文件,它将包含由动态链接程序来完成其工作所必需的数据,如图书馆的名称链接,以及需要解决的符号。

即使是一个空的main()程序也会连接到c-runtime和kernel32.dll库(可能还有其他的? - 从我上次做Win32 dev开始)。

你也应该知道,main()只是入口点你程序 - 相当多的已经走了这一点,如检索和tokening命令行,设置本地化,创造stderr之前, stdinstdout,并设置c运行时库所需的其他机制,例如at_exit()。同样,当你的main()返回时,运行时会进行一些清理 - 至少需要调用内核来告诉它你已经完成了。

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

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

+0

可以解释一下,这是什么c运行时?我不明白它是什么,如果c prog需要'运行时'它在系统中,而不是链接在隐藏的例程的形式,你提到的六或八件事情(处理命令行,设置语言环境...)非常有趣,但是需要通过隐藏函数完成它是什么 - 一些链接的包装器winapi例程(如果是这样,也许它会解释的东西)TnX很多 – 2012-08-16 20:06:18

+0

前一段时间,我读了一个关于创建最小的exe文件的页面,我赶紧搜索它,发现这一个(不完全一样,我以前看到,但相似):http://www.phreedom.org/research/tinype/ – rpsml 2012-08-16 20:07:56

+0

@rpsml Ive在半年或一年前收回了它,这是极好的文章,是的,但它表明,在这里没有需要隐藏的例程ro运行代码...所以它没有解释链接在哪些例程链接:/:O:[ – 2012-08-16 20:18:01

1

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

+0

我用三个或四个小的旧编译器测试过它,注意到这些例程的“数量”不同,有些放少了一些。 Disassembly表明它们存在但没有符号,也没有信息它是什么 – 2012-08-16 20:10:23

1

你没有太多的细节去,但我想大多数的,你看到的可能是特定的C运行时库,编译器与工作的程序。

例如会有代码,使其能够从入口点“主”,这可移植可执行格式理解调用主(字符**参数),你在你的C程序中写道运行。

+0

什么是这样的c-runtime。什么是这样的神秘代码,使我的主要运行?我可以在哪里找到有关这种奇怪事情的信息?我正在寻求更多有关这些东西/隐藏的例程的信息:( – 2012-08-16 20:14:06