使用NASM在Windows x64汇编程序中无法解析的外部符号printf

塞米丝崛起

我最近一直在尝试学习汇编,并且偶然发现了这篇文章作者使用NASM和Microsoft链接器来设置组装环境。我遵循相同的步骤并安装了NASM。然后,我开始编译hello world应用程序。编译成功,但是在链接阶段出现错误。错误如下:

hello_world.obj : error LNK2001: unresolved external symbol printf
hello_world_basic.exe : fatal error LNK1120: 1 unresolved external

这是Microsoft链接器(link.exe)的输出。我按照文章中的描述运行来自Developer Command Prompt的链接命令,并且因为hello world是64位应用程序,所以我正确设置了LIB环境变量(即使文章中未提及)。

hello_world.asm

bits 64
default rel

segment .data
   msg db "Hello world!", 0xd, 0xa, 0

segment .text
global main
extern ExitProcess
extern printf




main:
   push    rbp
   mov     rbp, rsp
   sub     rsp, 32

   lea     rcx, [msg]
   call    printf

   xor     rax, rax
   call    ExitProcess

在Windows命令提示符下编译程序。

nasm -f win64 -o hello_world.obj hello_world.asm

设置LIB环境变量。

set LIB=LIB=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\ATLMFC\lib\x86;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\lib\x64;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x86;C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64;C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64

并链接成可执行文件。

link hello_world.obj /subsystem:console /entry:main /out:hello_world_basic.exe "KERNEL32.LIB"

问题是什么?我有什么想念的吗?

塞米丝崛起

根据链接,Microsoft已将一些标准C内容移至@Jester共享的另一个库中

所有printf和scanf函数的定义都已内联移动到<stdio.h>,<conio.h>和其他CRT标头中。此重大更改会导致在本地声明这些功能但不包括适当的CRT头文件的任何程序的链接器错误(LNK2019,未解析的外部符号)。如果可能,应更新代码以包括CRT头文件(即添加#include <stdio.h>)和内联函数,但是如果您不想修改代码以包括这些头文件,则另一种解决方案是在链接器输入中添加一个额外的库legacy_stdio_definitions.lib。

因此,您需要链接legacy_stdio_definitions.lib以实现,printf还需要初始化CRT,因此请将源代码更改为

bits 64
default rel

segment .data
    msg db "Hello world!", 0xd, 0xa, 0

segment .text
global main
extern ExitProcess
extern _CRT_INIT

extern printf

main:
    push    rbp
    mov     rbp, rsp
    sub     rsp, 32

    call    _CRT_INIT

    lea     rcx, [msg]
    call    printf

    xor     rax, rax
    call    ExitProcess

最后,按如下所示运行链接器。

link hello_world.obj /subsystem:console /entry:main /out:hello_world_basic.exe kernel32.lib legacy_stdio_definitions.lib  msvcrt.lib

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Mac OS X使用main和scanf / printf的32位nasm汇编程序?

来自分类Dev

如何使用汇编程序(x64 OS)获取进程环境块(PEB)地址?

来自分类Dev

如何使用汇编程序(x64 OS)获取进程环境块(PEB)地址?

来自分类Dev

用户提供文件名时无法从文件读取(使用nasm的x86汇编程序)

来自分类Dev

如何使用Nasm汇编程序使用C-printf()仅打印一定数量的字节?

来自分类Dev

使用mmap函数创建数组。汇编程序x86_64 AT&T

来自分类Dev

在64位Windows上设置汇编程序

来自分类Dev

为什么我要通过GNU汇编程序(GAS)使用NASM?

来自分类Dev

使用 Nasm 汇编程序的 CMPXCHG8B 示例

来自分类Dev

如何在NASM汇编程序中对大字节序列进行位移?

来自分类Dev

如何在NASM汇编程序中打印以下内容?

来自分类Dev

clang 使用哪个汇编程序?

来自分类Dev

来自 mingw64 的 gcc 不使用来自 mingw 套件的汇编程序

来自分类Dev

如何使用x86汇编程序交换16位值?

来自分类Dev

汇编程序8086中的内存使用情况

来自分类Dev

如何在MASM格式的汇编文件中强制使用GNU汇编程序指令,反之亦然

来自分类Dev

使用汇编程序的内存损坏

来自分类Dev

Scala / Clojure使用了哪些汇编程序?

来自分类Dev

使用汇编程序的内存损坏

来自分类Dev

NASM汇编程序,如何两次定义标签?

来自分类Dev

在nasm汇编程序中将指针分配给指针

来自分类Dev

带有汇编程序的未解析外部符号C ++

来自分类Dev

不使用printf在NASM中打印ARGC

来自分类Dev

Windows 8.1 64位的NASM问题

来自分类Dev

如何在zlib CRC32中正确使用无进位乘法汇编程序集(PCLMULQDQ)?

来自分类Dev

使用C中的int汇编程序指令进行精确控制的流程,以及产生的段错误

来自分类Dev

汇编程序中Printf函数的用法

来自分类Dev

在NASM汇编器中使用%substr

来自分类Dev

任何x86-64 Linux汇编程序?

Related 相关文章

  1. 1

    Mac OS X使用main和scanf / printf的32位nasm汇编程序?

  2. 2

    如何使用汇编程序(x64 OS)获取进程环境块(PEB)地址?

  3. 3

    如何使用汇编程序(x64 OS)获取进程环境块(PEB)地址?

  4. 4

    用户提供文件名时无法从文件读取(使用nasm的x86汇编程序)

  5. 5

    如何使用Nasm汇编程序使用C-printf()仅打印一定数量的字节?

  6. 6

    使用mmap函数创建数组。汇编程序x86_64 AT&T

  7. 7

    在64位Windows上设置汇编程序

  8. 8

    为什么我要通过GNU汇编程序(GAS)使用NASM?

  9. 9

    使用 Nasm 汇编程序的 CMPXCHG8B 示例

  10. 10

    如何在NASM汇编程序中对大字节序列进行位移?

  11. 11

    如何在NASM汇编程序中打印以下内容?

  12. 12

    clang 使用哪个汇编程序?

  13. 13

    来自 mingw64 的 gcc 不使用来自 mingw 套件的汇编程序

  14. 14

    如何使用x86汇编程序交换16位值?

  15. 15

    汇编程序8086中的内存使用情况

  16. 16

    如何在MASM格式的汇编文件中强制使用GNU汇编程序指令,反之亦然

  17. 17

    使用汇编程序的内存损坏

  18. 18

    Scala / Clojure使用了哪些汇编程序?

  19. 19

    使用汇编程序的内存损坏

  20. 20

    NASM汇编程序,如何两次定义标签?

  21. 21

    在nasm汇编程序中将指针分配给指针

  22. 22

    带有汇编程序的未解析外部符号C ++

  23. 23

    不使用printf在NASM中打印ARGC

  24. 24

    Windows 8.1 64位的NASM问题

  25. 25

    如何在zlib CRC32中正确使用无进位乘法汇编程序集(PCLMULQDQ)?

  26. 26

    使用C中的int汇编程序指令进行精确控制的流程,以及产生的段错误

  27. 27

    汇编程序中Printf函数的用法

  28. 28

    在NASM汇编器中使用%substr

  29. 29

    任何x86-64 Linux汇编程序?

热门标签

归档