Чтобы извлечь отдельные функции из объектного файла, компоновщик должен знать, где начинается каждый и где он заканчивается. Он не может надежно сказать это со стороны сборки, поэтому вам нужно помочь.
Обычный способ заключается в том, чтобы поместить каждую функцию в отдельный файл и собрать их таким образом; таким образом, компоновщик может включать или исключать каждый объектный файл независимо. Это самый простой способ и работает с большинством ассемблеров, а не только с 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 v2.10."
MASM не поддерживает связь на уровне функций, поэтому нет простого способа сделать это, насколько мне известно. Вы можете добавить множество определений, которые определяют, какие части кода компилируются, или разделять код общего назначения на несколько файлов сборок, которые вы собираете в отдельные объектные файлы. – Michael
В 'Makefile' вы можете скопировать каждый входной файл в другое имя и затем отфильтровать эти копии с некоторым регулярным выражением [s] (чтение данных о функциях, используемых непосредственно из источника, например, с awk или Perl) на основе функций, которые вы хотите получить включенное на этот раз и включить эти копии, отфильтрованные повторно, а не полные оригинальные. – nrz