winapi在mingw汇编程序中的应用
我正试图将以下汇编代码编译到共享库(dll)中 使用以下命令:winapi在mingw汇编程序中的应用,winapi,gcc,assembly,mingw,ld,Winapi,Gcc,Assembly,Mingw,Ld,我正试图将以下汇编代码编译到共享库(dll)中 使用以下命令: i686-w64-mingw32-gcc -shared -o file.dll file.S 但我得到以下链接错误: `_GetProcAddress' referenced in section `.text' of /tmp/ccamwU4N.o: defined in discarded section `.text' of /usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i68
i686-w64-mingw32-gcc -shared -o file.dll file.S
但我得到以下链接错误:
`_GetProcAddress' referenced in section `.text' of /tmp/ccamwU4N.o: defined in discarded section `.text' of /usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i686-w64-mingw32/lib/../lib/libkernel32.a(dxprbs00553.o)
如何修复此错误并调用winapi函数?链接包含要调用函数的Windows DLL的导入库。
我相信这个符号包含在kernel32.dll中。您需要创建一个导入库,然后与之链接。与包含要调用的函数的Windows DLL的导入库链接。 我相信这个符号包含在kernel32.dll中。您需要创建一个导入库,然后与之链接。此代码:
// file: winapi0.s
.extern ___main
.extern _GetStdHandle@4
.extern _WriteConsoleA@20
.data
_text:
.ascii "Hello World!\12\0"
.section .text.startup,"x"
.p2align 2,,3
.globl _main
_main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $52, %esp
call ___main
movl $-11, (%esp)
call _GetStdHandle@4
pushl %edx
movl $0, 16(%esp)
leal -12(%ebp), %edx
movl %edx, 12(%esp)
movl $14, 8(%esp)
movl $_text, 4(%esp)
movl %eax, (%esp)
call _WriteConsoleA@20
subl $20, %esp
xorl %eax, %eax
movl -4(%ebp), %ecx
leave
leal -4(%ecx), %esp
ret
为我编译的内容非常好,包括:
gcc -Wall -O2 winapi0.s -o winapi0.exe
它的工作原理是打印以下内容:
Hello World!
这是一个经过略微清理的C代码版本,由gcc使用-s
开关翻译成汇编:
// file: winapi.c
#include <windows.h>
#include <tchar.h>
TCHAR text[] = _T("Hello World!\n");
int main(void)
{
DWORD err;
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),
text,
sizeof(text) / sizeof(text[0]),
&err,
NULL);
return 0;
}
不能对64位大小写执行相同的操作吗?此代码:
// file: winapi0.s
.extern ___main
.extern _GetStdHandle@4
.extern _WriteConsoleA@20
.data
_text:
.ascii "Hello World!\12\0"
.section .text.startup,"x"
.p2align 2,,3
.globl _main
_main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $52, %esp
call ___main
movl $-11, (%esp)
call _GetStdHandle@4
pushl %edx
movl $0, 16(%esp)
leal -12(%ebp), %edx
movl %edx, 12(%esp)
movl $14, 8(%esp)
movl $_text, 4(%esp)
movl %eax, (%esp)
call _WriteConsoleA@20
subl $20, %esp
xorl %eax, %eax
movl -4(%ebp), %ecx
leave
leal -4(%ecx), %esp
ret
为我编译的内容非常好,包括:
gcc -Wall -O2 winapi0.s -o winapi0.exe
它的工作原理是打印以下内容:
Hello World!
这是一个经过略微清理的C代码版本,由gcc使用-s
开关翻译成汇编:
// file: winapi.c
#include <windows.h>
#include <tchar.h>
TCHAR text[] = _T("Hello World!\n");
int main(void)
{
DWORD err;
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),
text,
sizeof(text) / sizeof(text[0]),
&err,
NULL);
return 0;
}
您不能对64位大小写执行相同的操作吗?为什么需要@(数字)?有些函数需要这样做,有些则不需要——例如,调用_LoadLibraryA和_LoadLibraryA@4似乎有效。顺便说一句,我猜这个数字就是参数的大小。@number是调用约定所必需的。数字是以字节为单位的函数参数的总大小。我不记得在64位模式下使用了什么调用约定。在MSDN上查找。为什么需要@(号码)?有些函数需要这样做,有些则不需要——例如,调用_LoadLibraryA和_LoadLibraryA@4似乎有效。顺便说一句,我猜这个数字就是参数的大小。@number是调用约定所必需的。数字是以字节为单位的函数参数的总大小。我不记得在64位模式下使用了什么调用约定。在MSDN上查找它。