У меня есть простая программа hello world C и я скомпилирую ее с / FA. Как следствие, компилятор также генерирует соответствующий листинг сборки. Теперь я хочу использовать masm / link для сборки исполняемого файла из сгенерированного списка .asm.
Следующая командная строка выдает 3 ошибки компоновщика:
\masm32\bin\ml /I"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include" /c /coff asm_test.asm
\masm32\bin\link /SUBSYSTEM:CONSOLE /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib" asm_test.obj
указывает, что функции времени выполнения C не были связаны с объектными файлами, созданными ранее:
asm_test.obj: ошибка LNK2001:
неразрешенный внешний символ
@__ security_check_cookie @ 4
asm_test.obj: ошибка LNK2001:
неразрешенный внешний символ _printf
ССЫЛКА: ошибка LNK2001: не устранена
внешний символ _wmainCRTStartup
asm_test.exe: фатальная ошибка LNK1120: 3
неразрешенные внешние факторы
Вот список сгенерированных сборок
; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01
TITLE c:\asm_test\asm_test\asm_test.cpp
.686P
.XMM
include listing.inc
.model flat
INCLUDELIB OLDNAMES
PUBLIC ??_C@_0O@OBPALAEI@hello?5world?$CB?6?$AA@ ; `string'
EXTRN @__security_check_cookie@4:PROC
EXTRN _printf:PROC
; COMDAT ??_C@_0O@OBPALAEI@hello?5world?$CB?6?$AA@
CONST SEGMENT
??_C@_0O@OBPALAEI@hello?5world?$CB?6?$AA@ DB 'hello world!', 0aH, 00H ; `string'
CONST ENDS
PUBLIC _wmain
; Function compile flags: /Ogtpy
; COMDAT _wmain
_TEXT SEGMENT
_argc$ = 8 ; size = 4
_argv$ = 12 ; size = 4
_wmain PROC ; COMDAT
; File c:\users\octon\desktop\asm_test\asm_test\asm_test.cpp
; Line 21
push OFFSET ??_C@_0O@OBPALAEI@hello?5world?$CB?6?$AA@
call _printf
add esp, 4
; Line 22
xor eax, eax
; Line 23
ret 0
_wmain ENDP
_TEXT ENDS
END
Я использую последнюю версию masm32 (6.14.8444).
Обновление
Как предложил Cogwheel, я включил INCLUDELIB msvcrt.lib
в источник asm. Программа компилируется и создается исполняемый файл, но компоновщик выдает предупреждение:
msvcrt.lib (crtmanifestrtm.obj): предупреждение LNK4044: нераспознанная опция "manifestdependency: type = 'win32' name = 'Microsoft.VC90.CRT' версия = '9.0.21022.8' processorArchitecture = 'x86' publicKeyToken = '1fbe188 «"; проигнорировано
Когда я запускаю исполняемый файл, среда выполнения C генерирует следующую ошибку:
Ошибка времени выполнения: R6034 Приложение попыталось загрузить библиотеку времени выполнения C неправильно