winapi在mingw汇编程序中的应用

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

我正试图将以下汇编代码编译到共享库(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/../../../../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上查找它。