Вызов printf в 64-битном MASM не работает (отлично работает)
Рассмотрим следующий код сборки (MASM) (helloworld.asm
):
extern puts: PROC
.data
msg db 'hello world', 0Ah, 00
.code
main proc
sub rsp, 40
lea rcx, msg
call puts
add rsp, 40
ret
main endp
End
Он прекрасно компилируется под Windows 7 (после установки необходимых инструментов разработки и настройки среды) и ведет себя как ожидалось:
$ ml64 helloworld.asm /link ucrt.lib vcruntime.lib msvcrt.lib /subsystem:console
[..]
$ helloworld.exe
hello world
Однако, если я заменю puts
с printf
в helloworld.asm
в строке 1 и строке 10 компоновщик не может разрешить ссылку на printf
:
$ ml64 helloworld.asm /link ucrt.lib vcruntime.lib msvcrt.lib /subsystem:console
[..]
helloworld.obj : error LNK2019: unresolved external symbol "printf" referenced in function "main".
helloworld.exe : fatal error LNK1120: 1 unresolved externals
В качестве бонуса: если я использую статические файлы библиотеки libucrt.lib
, libvcruntime.lib
а также libcmt.lib
работает с printf
:
$ ml64 helloworld.asm /link libucrt.lib libvcruntime.lib libcmt.lib /subsystem:console
Microsoft (R) Macro Assembler (x64) Version 14.11.25547.0
Copyright (C) Microsoft Corporation. All rights reserved.
Assembling: helloworld.asm
Microsoft (R) Incremental Linker Version 14.11.25547.0
Copyright (C) Microsoft Corporation. All rights reserved.
/OUT:helloworld.exe
helloworld.obj
libucrt.lib
libvcruntime.lib
libcmt.lib
/subsystem:console
$ helloworld.exe
hello world
Это не имеет никакого смысла для меня. Я, очевидно, могу скомпилировать C-программу с cl
который использует файлы динамической библиотеки (указав /MD
флаг) и компоновщик не имеет проблем с разрешением printf
условное обозначение.
Что здесь происходит и как это можно решить?