【问题标题】:masm output .obj can not be linked with othersmasm 输出 .obj 不能与其他链接
【发布时间】:2013-10-24 08:15:59
【问题描述】:

谁能告诉我如何将 masm 输出与其他目标文件链接起来。例如 main.obj。

我正在开发一个 Windows 内核模式驱动程序,我想移动内联 asm 块以分隔 .asm 文件以满足进一步的要求并防止进一步的困难,例如:x64 不支持内联 asm。

所以,我将 vm.asm 源文件添加到项目中,并从构建自定义中选择了 masm。之后,我为项目类型选择了 Microsoft 宏汇编程序。当我构建项目时 vm.obj 文件已成功为 vm.asm 文件创建。但我不能从 C 代码调用 asm 函数(proc)。应该是链接错误,我认为构建过程没有将 obj 文件放在一起。

我也试过 stdcall 和 cdecl 但结果是一样的。

我的 vm.asm:

.386
.model flat, C
option casemap :none 

PUBLIC _get_vm

_get_vm PROC
      mov eax, 0101h
      db 0fh 
      db 01h 
      db 0c1h
      ret
_get_vm endp
END

这是我的 c 调用:

ULONG vm_id;
extern int _cdecl get_vm();

vm_id = get_vm();

错误: project_ddk\main.obj:错误 LNK2019:函数 _DispatchPnP@8 中引用的未解析外部符号 _get_vm

我的 ml.exe 命令行:

ml.exe /c /nologo /safeseh /Zi /Fo"%(FileName).obj" /Fl"" /W3 /errorReport:prompt /Ta

【问题讨论】:

  • 你试过去掉下划线吗?
  • 是的,我试过了。但结果相同。
  • 您是否检查过您的 asm 文件导出了哪些符号?您应该会看到主文件所期望的名称。
  • @Devolus 我如何检查它?我的意思是符号
  • 我不知道你使用的是哪个环境,但如果你安装了 Visual Studio,你应该有dumpbin,它类似于 Linux 下的objdump。有了这个,您可以检查您的 lib/obj 文件的所有方面。 dumpbin /SYMBOLS your_asm.obj 应该显示你所有的名字。

标签: assembly build driver linker-errors symbols


【解决方案1】:

这是我用来测试链接到 C 的一些示例(希望它有所帮助)。

main.cpp:

#include <iostream>
#include <string.h>
#include <windows.h>

extern "C"
{
    void PopTest(void);
};

int main(int argc, char*arg[])
{
    PopTest();
    return 0;
}

test.asm

.486
.model flat, C
option casemap :none

.data

.code

;***********************
;
; Just a demo how to declare functions to be used from C
;
PopTest PROC

    push es
    xor eax,eax
    push eax
    pop es
    pop es

    mov eax, 2134
    push eax
    mov ebx, [esp]
    add esp, 04
    mov ecx, [esp-4]
    ret

PopTest ENDP

END

VS2008 中的自定义构建步骤:

D:\Programme\masm32\bin\ml.exe /coff /c test.asm /Fo test.obj
copy test.obj Debug\test.obj
del test.obj

【讨论】:

  • 感谢您的帮助,我已经尝试过这样但没有改变。如何用这个外部对象编译驱动程序?我的输出至少是 .sys
  • 可能是驱动程序有不同的规则。如果可以调用asm函数,您是否首先使用简单的exe文件进行测试?这是否也不起作用,或者仅当您尝试编译驱动程序时?可能是链接步骤不同。
【解决方案2】:

我从未使用 masm 制作过 C 函数,但在正常程序中你需要一个文本段,它可能需要定义一个文本段。

.386
.model flat, C
option casemap :none 

PUBLIC _get_vm
_TEXT SEGMENT
_get_vm PROC
      mov eax, 0101h
      db 0fh 
      db 01h 
      db 0c1h
      ret
_get_vm endp
_TEXT ENDS
END

编辑:我只是尝试制作一个在 C 中工作的简单程序,我得到了这个并且这个工作;

MASM 过程;

.386
.model flat, C
option casemap :none

PUBLIC func
_TEXT SEGMENT
func PROC
      mov eax, 2
      ret
func ENDP
_TEXT ENDS
END

C 调用;

#include <stdio.h>

int main(){
    int i = 5+func();
    printf("%d",i);
    return 0;
}

命令;

masm -> ml -c -coff func.asm

C -> gcc prog.c func.obj -o main

输出 -> 7

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多