2009-04-18 39 views
10

如何確定使用哪種C或C++編譯器來構建特定的Windows可執行文件或DLL?一些編譯器在最終的可執行文件中留下了版本字符串,但這在Windows上似乎比在Linux上少見。確定構建Win32 PE的編譯器

具體來說,我有興趣區分Visual C++和各種MinGW編譯器(通常從函數簽名中相當容易),然後在Visual C++版本之間進行區分(6,2002/2003,2005,2008;更難以做)。有沒有一種工具能夠以半可靠的方式進行區分?

+1

是什麼驅動你需要這些信息? – ojblass 2009-04-18 22:17:32

+0

首先,想知道什麼版本的VS被用來構建我們這裏的一些二進制文件。 (我正在考慮用更新版本的VS重建它們,以獲得接近免費的性能提升。)我發現有人知道這些特定的二進制文件的答案,但我很好奇它是否可以在一般情況下完成。 – kquinn 2009-04-18 22:27:52

+0

這種情況下的答案不是僅僅在任何情況下使用最新的編譯器進行重建?您可以使用相同的編譯器重新編譯,不做任何更改,或者最終使用更新的編譯器,爲您提供您提到的優勢。 – jalf 2009-04-18 22:56:14

回答

1

IDA-Pro執行的部分分析包含一些編譯器識別。打開PE進行分析後,查看輸出日誌。它通常被埋在那裏。

11

區分VC版本的提示的一個來源是鏈接的特定C運行時庫。由於默認情況下(至少在現代版本中)鏈接到DLL,這很容易做到。實用程序Dependency Walker幾乎是驗證您知道哪些DLL真的被加載的必不可少的,它會告訴您哪個C運行時DLL正在使用中。雖然Dependency Walker包含在Microsoft Platform SDK中,但它已被獨立擴展,並且我所鏈接的站點是其當前開發的主場。

默認情況下VC6和MinGW都鏈接到MSVCRT.DLL,所以這不會區分它們。通過一些努力,MinGW可以被鏈接到後來的C運行時版本,所以你需要獨立排除MinGW。

Runtime  VC Version 
---------- ------------- 
MSVCRT.DLL VC6 
MSCVR80.DLL VC8 (VS 2005) 
MSCVR90.DLL VC9 (VS 2008) 

其他運行時DLL也是很好的線索,例如,引用Delphi的運行時可能表明EXE實際上是由Delphi構建的,而不是C工具鏈。

如果符號沒有從.EXE文件中剝離,那麼您可能會發現一些內部符號的線索。例如,對_sjlj_init等內容的引用可能表示在某個點上涉及爲setjmp/longjmp異常處理配置的MinGW GCC 3.x。

2

另一種方法是檢查dll鏈接到的CRT庫depends.exe
MinGW和Cygwin有自己的dll,這些dll很明顯可以識別。
VC6使用了MSVCRT.dll通常
VS任何更新版本的旁邊有DLL的文件名,它的版本:
MSVCR90.DLL - VS2008
MSVCR80.DLL - VS2005
MSVCR71.DLL - VS2003
MSVCR70。 - VS2002

不要把這個列表作爲權威指南,因爲這些名稱往往有奇怪的變化,尤其是在VS2002-2003領域。還有其他類似於MFC和ATL dll的dll具有類似的版本控制方案。

只要PE實際上取決於CRT並且它沒有靜態鏈接到它,這將工作。

我想德爾福也有一些DLL鏈接到,但我不確定它是什麼。