【问题标题】:FASM DLL with C executable error 0xc000007b带有 C 可执行文件错误 0xc000007b 的 FASM DLL
【发布时间】:2020-04-07 07:36:27
【问题描述】:

我在 FASM 中创建了一个 dll 库,现在我想在我的 C 项目中使用它,但是当我想打开可执行文件(由 C (GCC) 生成)时出现错误

FASM dll 代码:

FORMAT  PE64 CONSOLE DLL
ENTRY   _entry

include 'EXPORT.INC'

section '.code' code readable executable

_entry:
        mov     eax, 1
        ret

func:
        mov     eax, 5
        ret

section '.edata' export data readable

        export 'libs.dll', func, 'func'

section '.reloc' fixups data readable discardable

C(CMake):

cmake_minimum_required(VERSION 3.15)
project(untitled6 C)

set(CMAKE_C_STANDARD 11)

add_executable(untitled6 main.c)

target_link_libraries(untitled6 "D:\\untitled6\\libs.dll")

C 代码:

int
main() {
    int i;
    asm volatile ("call\tfunc" : "=a"(i));
    return i;
}

当我尝试打开可执行文件时,我收到此错误:
D:\untitled6\libs.dll 不是设计为在 Windows 上运行或包含错误...。错误状态 0xc000007b

可执行文件和 DLL 都适用于 64 位...但我真的不知道问题出在哪里!!!

【问题讨论】:

  • This forum thread 包含一个 FASM 原作者的 64 位 DLL 示例,据说可以工作。
  • 你为什么使用内联 asm 以违反调用约定的方式运行 call 指令,例如不保留阴影空间?如果必须发生任何惰性动态链接,您可以在 main 的返回地址上添加代码。 (如果 Windows 曾经这样做过,IDK;也许不会)。只需为func 声明一个原型,然后像普通人一样执行int i = func();,让编译器为您发出call
  • 这是不可能的,因为我有我自己的那个函数的寄存器......这是一个简单的例子来找出真正的问题(这是“数据修复\n结束数据”(我必须添加这个)) ...但我使用自己的寄存器来传递参数,所以我必须使用内联 asm ...并且阴影空间不适合这里,因为在我的函数中没有调用 Windows 函数(我的函数独立于内核函数)

标签: assembly dll fasm


【解决方案1】:
  1. 问题是 Windows 不会加载不使用任何 Window 功能的图像 (.DLL)。这是因为你有“0xC000007B”-“STATUS_INVALID_IMAGE_FORMAT”。这是 Windows 的“功能”。
  2. 如果您正在为 C++ 开发库,则必须使用 C++ 调用约定 (cdecl)。在平面汇编器 (FASM) 中,您可以这样做:

proc 函数 c

例子:

库(FASM x64):

; libs.asm
format PE64 console DLL
entry DllEntryPoint

include 'win64a.inc'
;---------------------------------------------------------------------
section '.text' code readable executable

proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
  invoke GetModuleHandleA, 0
  mov eax, TRUE
  ret
endp
;---------------------------------------------------------------------
proc func c
    mov rax, 5
    ret
endp
;---------------------------------------------------------------------
section '.edata' export data readable
  export 'libs.dll', func,'func'
;---------------------------------------------------------------------
section '.reloc' fixups data readable discardable
  if $=$$
    dd 0,8              ; if there are no fixups, generate dummy entry
  end if
;---------------------------------------------------------------------
section '.idata' import data readable writeable
  library kernel32,'KERNEL32.DLL'
  import kernel32,\
    GetModuleHandleA,'GetModuleHandleA'

测试代码(FASM x64):

; x64 (ANSI) test
format PE64 GUI 5.0
entry start

include 'win64a.inc'
;---------------------------------------------------------------------
section '.text' code readable executable

  start:
    sub     rsp,8           ; Make stack dqword aligned
    cinvoke  func
    cinvoke  wsprintfA, buffer, _fmt, rax
    invoke  MessageBox, NULL, buffer, _title, MB_ICONINFORMATION+MB_OK
    invoke  ExitProcess,0
;---------------------------------------------------------------------
section '.bss' data readable writeable
  buffer              rb 100h ; 256
;---------------------------------------------------------------------
section '.data' readable
  _title              db 'Title',0
  _fmt                db 'Function result: %d',0
;---------------------------------------------------------------------
section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
          user32,'USER32.DLL',\
          libs,'libs.dll'
          
  import libs, func,'func'

  include 'api\kernel32.inc'
  include 'api\user32.inc'

【讨论】:

    猜你喜欢
    • 2017-09-07
    • 1970-01-01
    • 2013-05-10
    • 2023-03-11
    • 2021-09-02
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多