看不见_penter和_pexit符号

时间:2018-07-08 03:50:24

标签: windows assembly visual-c++ dll linker-errors

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

使用/ Gh和/ GH编译时,获取我所有项目文件的error LNK2001: unresolved external symbol _pexiterror LNK2001: unresolved external symbol _penter。我有两个项目的解决方案-一个我的主项目是用/ GH和/ Gh编译的,另一个是在装配文件中定义_penter_pexit的DLL项目(自从我写了一个单独的装配文件以来,应用是x64)。

如果我有另一个符号(DLL中的另一个函数),可以看到它,并且我可以从另一个项目中调用它,并且它可以按预期正常工作,但是当我使用/ GH和/ Gh选项进行编译时找不到_penter_pexit的定义。找不到原因。

此外,如果我尝试将_penter_pexit写入cpp文件本身,则它会暴露出来,其他项目也可以看到它。但是我不能用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

...

我在项目中的所有文件。

我在做什么错?如何使我的项目看到_penter_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

0 个答案:

没有答案