2013-03-14 61 views
1

我在彙編程序中創建了一個單獨的包含文件,用於一般用途。 (如字符串操作/格式化輸入/等) 當我包含這些文件時,我注意到所有函數都包含在目標二進制文件中。如何只包含彙編包含文件的部分

是否有辦法我可以管理只包括使用的功能(如使用C/C++庫文件中的包含文件)?

我正在使用MASM並以x86爲目標。

+1

MASM不支持功能級鏈接,所以沒有簡單的方法來做到這一點,據我所知。您可以添加一堆定義來確定要編譯的代碼的哪些部分,或將通用代碼拆分爲多個彙編文件,這些彙編文件將彙編爲單獨的對象文件。 – Michael 2013-03-14 13:21:59

+0

在'Makefile'中,您可以將每個輸入文件複製到另一個名稱,然後使用一些正則表達式[s](基於您的函數讀取源代碼中直接使用的函數的數據,例如awk或Perl)想要這次包括,幷包括這些正則表達式過濾的副本,而不是完整的原始副本。 – nrz 2013-03-14 15:29:35

回答

2

要從一個目標文件中提取單獨的函數,鏈接器需要知道每個函數的起始位置和結束位置。它不能可靠地告訴大會,所以你需要幫助它。

一種常見的方法是將每個函數放入一個單獨的文件中並像這樣組裝它們;這樣鏈接器可以獨立地包含或排除每個目標文件。這是最簡單的方法,適用於大多數彙編程序,而不僅僅是MASM,所以我建議嘗試它。

另一種方法是將每個函數放入一個單獨的段; MS鏈接器可以排除未使用的段,但如果它們被標記爲所謂的「COMDAT」(公用數據),則只能使用。不幸的是,MASM不支持設置這個屬性。

已經有上添加此信息給OBJ文件作爲後處理步驟一些工作,但不幸的工具存檔似乎是從互聯網上消失了:

Function level linking with MASM

其他鏈接:

How to achieve "function level linking" with MASM?(包括一個半自動分割成幾個文件的工具)。

flat assembler - COMDAT support

MSDN forums - Comdat

JWASM: Support for COFF COMDATs

最後一個環節提到了 「爲COMDAT支持是jwasm 2.10補充。」

+0

我會試試看。謝謝 – Haunted 2013-03-14 17:22:24