gpt4 book ai didi

visual-c++ - 编译由 VC++ 生成的程序集输出?

转载 作者:行者123 更新时间:2023-12-04 16:02:37 25 4
gpt4 key购买 nike

我有一个简单的 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 : error LNK2001: unresolved external symbol @__security_check_cookie@4 asm_test.obj : error LNK2001: unresolved external symbol _printf LINK : error LNK2001: unresolved external symbol _wmainCRTStartup asm_test.exe : fatal error LNK1120: 3 unresolved externals



这是生成的程序集 list
; 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) : warning LNK4044: unrecognized option "manifestdependency:type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'"; ignored



当我启动可执行文件时,C 运行时会生成以下错误:

Runtime error: R6034 An application has made an attempt to load the C runtime library incorrectly

最佳答案

我最近做了这个。事实证明,您仍然可以在 MSVC2012 中以 32 位模式执行此操作,但我认为 64 位模式是没有希望的。

对于 32 位模式,这就是您要做的。

创建一个空项目和一个源文件Source.cpp

 #include <stdio.h>
int main() {
printf("hello world\n");
return 0;
}
  • 右键单击您的项目并选择“构建自定义”并
    选择此处描述的 masm http://www.masm32.com/board/index.php?topic=9231.0
  • 在 C++/OutputFiles 下选择程序集输出/FA
  • 32位模式下编译 Release模式
  • 将 Source.asm 文件加载到 MSVC 中,以便您可以查看它。它还行不通。一些改变是必要的。
  • 在 C++/Optimization 下关闭整个程序优化(删除 /GL )。这将添加行 INCLUDELIB MSVCRT
  • 在 Linker/Advanced 中将最后一个选项“Image Has Safe Exception Handlers”设置为 No (/SAFESEH:NO)
  • 现在您应该有一个 Source.asm 文件,它将执行与 Source.cpp 文件相同的操作。将 Source.cpp 从 Release 目录复制到与 Source.cpp 相同的目录(因此在构建/清理时不会将其删除)。
  • 将 Source.asm(作为现有文件)添加到 Source Files 并从构建中删除 Source.cpp。
  • 重建,您应该可以看到“Hello World”,而无需手动更改任何 assembly 线。

  • 我已经将它用于更复杂的功能。我通常在一个单独的模块上使用 extern "C"在函数名称上删除 C++ 名称修饰。

    关于visual-c++ - 编译由 VC++ 生成的程序集输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2815636/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com