首页 > 解决方案 > _penter 和 _pexit 符号未见

问题描述

使用 Visual Studio 2013 C++ 在 Windows 中编写解决方案并尝试使 _penter 和 _pexit 挂钩工作。

当我使用 /Gh 和 /GH 编译它时,获取 error LNK2001: unresolved external symbol _pexit并 获取我的所有项目文件。error LNK2001: unresolved external symbol _penter我有一个包含两个项目的解决方案 - 一个是使用 /GH 和 /Gh 编译的主项目,另一个是在程序集文件中定义的 DLL 项目_penter_pexit为它编写了一个单独的程序集文件,因为我的应用程序是 x64)。

如果我有另一个符号(DLL 中的不同函数),则可以看到它并且我可以从另一个项目中调用它并且它可以按预期正常工作,但是当我使用 /GH 和 /Gh 选项编译时它没有找到_penter和的定义_pexit。无法找到为什么会发生这种情况。

此外,如果我尝试在 cpp 文件本身中编写_penterand _pexit,它会被暴露并且其他项目能够看到它。但是我不能在 x64 中编写内联程序集,所以我将它写在一个单独的 asm 文件中,但不会暴露。

def另外,我尝试按如下方式编写文件,

LIBRARY   EXTLIB
EXPORTS _penter
EXPORTS _pexit

并将我的主要项目指向它,它给了我这两个错误,

1>------ Build started: Project: MyProj, Configuration: Release x64 ------
1>Definitions.def : error LNK2001: unresolved external symbol _penter
1>Definitions.def : error LNK2001: unresolved external symbol _pexit
1>..\..\build\MyProj.lib : fatal error LNK1120: 2 unresolved externals
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========

当我不提供 def 文件时,错误就像,

1>Reality.obj : error LNK2001: unresolved external symbol _pexit
1>Reality.obj : error LNK2001: unresolved external symbol _pexit

...

对于我在项目中的所有文件。

我究竟做错了什么?如何让我的项目看到_penterand的定义_pexit

编辑:

    extern entry:Proc
extern exit:Proc
PUBLIC _penter
PUBLIC _pexit
EXPORTS _penter
EXPORTS _penter
.code
    PUSHREGS    macro
        push    rax
        push    rcx
        push    rdx
        push    r8
        push    r9
        push    r10
        push    r11
    endm
    POPREGS macro
        pop r11
        pop r10
        pop r9
        pop r8
        pop rdx
        pop rcx
        pop rax
    endm
_penter proc
    push rax
    lahf
    PUSHREGS
    sub rsp, 8+16
    movdqu xmmword ptr[rsp], xmm0
    sub rsp ,8
    sub  rsp,28h    
    mov  rcx,rsp
    mov  rcx,qword ptr[rcx+136]
    call entry
    add  rsp,28h
    add rsp, 8 
    movdqu xmm0, xmmword ptr[rsp]
    add rsp, 8+ 16
    POPREGS
    sahf
    pop rax
    ret
_penter endp
_pexit proc
    push rax
    lahf
    PUSHREGS
    sub rsp, 8+16
    movdqu xmmword ptr[rsp], xmm0
    sub rsp ,8
    sub  rsp,28h 
    mov  rcx,rsp
    mov  rcx,qword ptr[rcx+136]
        call exit
    add  rsp,28h
    add rsp, 8 
    movdqu xmm0, xmmword ptr[rsp]
    add rsp, 8+ 16
    POPREGS
    sahf
    pop rax
    ret
     _pexit endp
end

标签: windowsassemblyvisual-c++dlllinker-errors

解决方案


推荐阅读