【问题标题】:How to include only sections of Assembly include files如何仅包含程序集包含文件的部分
【发布时间】:2013-03-02 19:28:21
【问题描述】:

我创建了一个单独的包含文件,用于我的汇编程序中的通用用途。 (如字符串操作/格式化输入/等) 当我包含这些文件时,我注意到所有函数都包含在目标二进制文件中。

有没有办法只包含使用过的函数(例如在 C/C++ 库文件中使用包含文件)?

我正在使用 MASM 并针对 x86。

【问题讨论】:

  • MASM 不支持函数级链接,因此据我所知没有简单的方法可以做到这一点。您可以添加一堆定义来确定要编译的代码部分,或者将通用代码拆分为多个汇编文件,然后再汇编成单独的目标文件。
  • Makefile 中,您可以将每个输入文件复制到另一个名称,然后使用一些正则表达式过滤这些副本(读取直接从源使用的函数的数据,例如使用 awk 或Perl)基于您这次想要包含的功能,并包含这些正则表达式过滤的副本,而不是完整的原始副本。

标签: function assembly include x86 masm


【解决方案1】:

要从目标文件中提取单独的函数,链接器需要知道每个函数的开始位置和结束位置。它不能从程序集中可靠地分辨出来,所以你需要帮助它。

一种常见的方法是将每个函数放在一个单独的文件中,然后像这样组装它们;这样,链接器可以独立地包含或排除每个目标文件。这是最简单的方法,并且适用于大多数汇编程序,而不仅仅是 MASM,所以我建议尝试一下。

另一种方法是将每个函数放入一个单独的段中; MS 链接器可以排除未使用的段,但如果它们被标记为所谓的“COMDAT”(公共数据)。不幸的是,MASM 不支持设置此属性。

在将这些信息添加到 OBJ 文件作为后处理步骤方面进行了一些工作,但不幸的是,该工具的存档似乎从 Internet 上消失了:

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

最后一个链接提到“jwasm v2.10 中添加了对 COMDAT 的支持。”

【讨论】:

    猜你喜欢
    • 2015-08-04
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2012-05-02
    • 1970-01-01
    • 2012-02-13
    相关资源
    最近更新 更多