在程序集中从kernel32.dll导入GetStdHandle函数

时间:2014-08-23 16:24:25

标签: assembly dll import reference undefined

我有来自kernel32.dll的导入GetStdHandle函数的问题,当我尝试链接我的应用程序时收到该错误:

winapiwrite.obj:winapiwrite.asm:(.text+0x7): undefined reference to `GetStdHandle@4'

我的应用代码:

;winapiwrite.asm
;
;Command line
;nasm -f win32 winapiwrite.asm
;ld winapiwrite.obj -o winapiwrite.exe c:\windows\system32\kernel32.dll

[bits 32]
extern _ExitProcess@4
extern _GetStdHandle@4
extern _WriteConsoleA@20
global _WinMain@16

section .data
str_hello:
  db "Hello world!", 0  ;length = 12bytes

section .text
_WinMain@16:
  ;stack frame
  push ebp
  sub esp, 4

  ;GetStdHandle( -11 ): stdoutput
  push -11
  call _GetStdHandle@4
  mov ebx, eax

  ;WriteConsoleA( Output, &text, len, &bytes, reserved ) 
  push 0
  lea eax, [ebp-4]
  push eax
  push 12
  push str_hello
  push ebx
  call _WriteConsoleA@20

  ;ExitProcess( 0 )
  push 0
  call _ExitProcess@4
;END OF _WinMain@16
当我在代码中更改函数名称时,

附加:

_GetStdHandle@4

为:

_GetStdHandle

我收到了这个错误:

ertr000006.o:(.rdata+0x0): undefined reference to `_pei386_runtime_relocator'

我不知道什么ExitProcess和WriteConsoleA导入没有问题,而GetStdHandle是问题,我从几个小时开始考虑这个问题,我没有任何解决方案。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

[溶液]

我的电脑中的kernel32.lib有问题。我下载了另一个kernel32.lib,并且没有链接器问题。