2010-08-29 63 views
2

我想知道是否可以將多個DLL組合成1個。我目前正在研究一個依賴於許多動態鏈接庫的C++項目,所以將它們組合成1 DLL文件,如果是這樣,我該怎麼做?將多個DLL組合成1

+1

你能澄清你是否有這些DLL的源代碼? – ysth 2010-08-29 18:09:24

+0

我確實有這些DLL的源代碼,是的。 – 2010-08-29 18:14:23

回答

2

實際上,沒有。理論上,如果你想足夠糟糕,你可以做一些反彙編所有的東西,然後將所有單獨的文件重新組裝成目標文件,然後將這些目標文件重新鏈接成一個大的DLL。實際工作通常不是微不足道的 - 可能會出現諸如衝突的符號名稱之類的事情,需要大量工作才能解決。

一個比較乾淨的可能性是將所有的DLL打包成一個zip文件(或任何你喜歡的),並有一個小程序將它們解壓縮到一個臨時目錄,運行主程序,然後從那裏清除DLL目錄。儘管如此,它也有一些問題(例如,如果機器崩潰/失去電源/在運行期間丟失任何文件,則會留下文件的副本)。

編輯:由於您有源代碼,使用它將所有代碼構建到單個DLL中更加合理。大多數情況下,只需將所有源文件添加到創建一個DLL作爲其輸出的單個項目即可。你可能(很容易)遇到一些符號衝突。鑑於對源代碼的訪問,處理這個問題的顯而易見的方法是將東西放入命名空間。

2

它當然不可行。 Dll格式包含將代碼和多個dll中的數據合併爲一個所需的全部信息,並對生成的代碼進行重新綁定。

這不是我能想到的任何工具鏈的標準功能。

+0

在一般情況下,這是不可能的,你會有很多重複的符號。 CRT的各個部分(所有這些都是靜態鏈接的)都將在兩個過程中進行,可能會進行優化,因此它們不是完全相同的副本。 – Blindy 2010-08-29 18:29:31

+1

這將重新鏈接。沒有需要將兩個dll粘合在一起的名稱級操作。你所要做的就是連接,或者創建重複(重命名).text,.sdata等節(這些節的名稱實際上並不相關)。然後處理重新定位表 - 根據合併部分的新基地址進行調整。 符號名稱不會進入它(除非您試圖修復調試信息)。 – 2010-08-29 18:50:02

+0

如果組合的DLL之一依賴於另一個DLL,則還必須清理導入地址表。你不能依靠自己。這是一個名稱級別的操作;必須按範圍(DLL)和符號名稱匹配導入和導出的條目。 – MSalters 2010-08-30 10:08:56

5

我確實有這些dll的源代碼,是的。

只需將所有DLL項目的所有源文件合併到一個DLL項目中?

如果您有多個* .def文件(每個項目一個),然後將它們組合成一個* .def文件。