【发布时间】: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 函数(我的函数独立于内核函数)