使用cl.exe将asm文件编译为dll

Sim*_*sch 3 assembly masm visual-c++

给出:带有入口点的prog.c prog

我通常会

cl.exe /MD /LD /Fe"prog.dll" /Fo"prog" "prog.c" /link ext.lib
Run Code Online (Sandbox Code Playgroud)

要么

cl.exe /MD /Fo"prog.obj"
cl.exe /MD /LD /Fe"prog.dll" "prog.obj" /link ext.lib
Run Code Online (Sandbox Code Playgroud)

在两种情况下,生成的prog.dll都可以正常工作。

现在,我执行以下操作来获取一个asm文件而不是obj文件:

cl.exe /c /MD /Fa"prog"
Run Code Online (Sandbox Code Playgroud)

到目前为止,这个“工作”也是如此。但我不知道如何制作此文件的dll。

尝试过:

ml.exe /c /Cx /coff prog.asm
cl.exe /MD /LD /Fe"prog.dll" "prog.obj" /link ext.lib
Run Code Online (Sandbox Code Playgroud)

结果:没有入口点的prog.dll prog

再次尝试:

ml.exe /c /Cx /coff prog.asm
cl.exe /MD /LD /Fe"prog.dll" "prog.obj" /link /entry:prog ext.lib
Run Code Online (Sandbox Code Playgroud)

结果:编译器警告错误的入口点_prog不能用12个字节的参数进行stdcall以及有关未解析符号_memcpy的编译器错误。

问题:有什么方法可以将由/ Fa生成的cl.exe生成的asm文件编译为dll(最好是通过cl.exe,如果不能使用ml.exe编译)?

Cod*_*ray 5

有什么方法可以将cl.exe生成的asm文件编译/Fa为dll(最好是通过cl.exe,如果无法使用ml.exe 进行编译)?

没有:

  1. C / C ++编译器(cl.exe)无法汇编汇编代码输入。它仅将C或C ++源代码作为输入。汇编程序是MASM(ml.exe)。
  2. 通常,不能将cl.exe的汇编代码输出直接输入到MASM中。在某些情况下,它甚至不是有效的汇编代码。在其他情况下,MASM不直接支持代码中发出的指令,关键字和其他内容。如果C / C ++源代码使用异常,则事情变得特别棘手。清单文件仅供参考

对我来说还不清楚,为什么您一开始就想这样做。如果您的源代码是C或C ++,并且可以通过MSVC进行编译和链接,那么引入将其与汇编语言之间进行转换的附加中间步骤的目的是什么?只需直接使用cl.exe制作DLL。

如果绝对必须这样做,则必须使用MSVC生成的ASM列表文件,并在通过MASM运行该文件之前对其进行手动清理。您可以通过关闭整个程序优化,关闭异常处理,关闭安全检查/饼干,并指示链接器的图像确实让这个清理任务更容易包含安全SEH处理程序。请注意,其中一些可能会破坏或更改代码的行为!您还需要为EXTERN从运行时库调用的函数添加定义。