2012-08-16 31 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