2013-09-16 28 views
3

我們有這種情況,我們有大量的相互關聯的DLL構成了我們的產品。這是一個非常「古老」的產品(因爲它已經發展了20年),並且在過去由於Visual Studio的幾個版本的結構打包的不同默認而受到影響。是否有可能找到DLL中聲明的結構的大小?

因此,在DLL頭文件中沒有使用#pragma pack但在工程屬性中設置了結構對齊的許多情況下,我們可能會遇到導入DLL的項目(通過它lib和header)具有不同的結構對齊,並可能導致結構大小不匹配。

由於「事故」可以正確確定結構的大小,如果結構的所有成員都是unsigned int,那麼DLL中的pack(4)和導入項目中的pack(2)可以正常工作。當然,直到某人修改一個結構來添加一個bool爲例。

我想通過將#pragma pack語句添加到所有導出模塊的頭文件中來消除所有這些潛在的混淆,但首先要評估我們當前代碼中是否存在任何此類暴露(考慮難以跟蹤運行時錯誤在這裏)。另外,在構建過程中引入一些自動檢查以確保我們永遠不會遇到這些情況,即使使用第三方DLL或LIB也是有用的。

所以,我的問題:

是否有可能,從編譯的DLL,或其相關LIB,以確定在當時的DLL力是什麼結構對齊編譯?同樣,是否可以發現這個EXE?

我想知道的是,如果PE格式或LIB(是COFF?)中有什麼可用於查找此信息嗎?

UPDATE

好了,沒有什麼好來自檢查庫和DLL與DUMPBIN,所以我要去嘗試從我們產生從我們的發佈版本的PDB文件的一些信息。我found this作爲一個起點...

+1

Dumpbin/HEADERS可能會告訴你,如果確實如此,那麼有一個編程方式可以找到。 –

+0

謝謝@jeffamaphone - 我會做一些虛擬的DLL來看看我可以從輸出中收集什麼。不要屏住呼吸,但它是值得一試。 –

回答

3

我會說這是不可能的。 C++沒有應用類型信息(除非使用RTTI啓用,但對此問題沒有多大幫助)。結構只不過是程序員的一個字節序列。編譯器將用適當的字節對齊來替換variable.member以訪問該數據。

我懷疑你有正確的調試信息(即PDB文件)的DLL來查找符號。即使如此,也不可能找到一個結構的「包裝」。

我在不同的EXE/DLL(具有完整的源代碼)中遇到了結構大小問題,其中sizeof只是我們可以用來查找差異的工具(並且嵌套查找問題的根源)。即使使用這種技術,也不可能爲特定結構啓用哪種包裝。

+0

謝謝,我真的認爲你是對的 - 我無法看到自己這些信息在邏輯上的位置,所以問題有點遠了。我會使用dumpbin做一些測試,因爲@jeffamaphone在上面評論過,但除此之外,我認爲現在爲我添加'#pragma pack'是一個漫長的道路... –

+0

如果我沒有PDB文件怎麼辦 – 2016-10-12 07:41:41

相關問題