MSVC Linker无法找到NASM生成目标文件中的Entry入口点求助
NASM汇编目标文件兼容GoLink但无法被MSVC链接器识别的问题与解决
问题描述
我正在进行汇编编程实验,编写了如下简单程序:
extern ExitProcess segment Main Entry: push 0 call ExitProcess
使用NASM汇编:
nasm.exe -f win64 -o Entry.obj Entry.asm
编译成功后,用MSVC链接器链接:
link.exe /subsystem:console /entry:Entry /out:Test.exe Entry.obj kernel32.lib
出现错误:
LINK : error LNK2001: unresolved external symbol Entry
确认已定义入口点但无法排查原因,改用GoLink链接:
GoLink.exe /console /entry Entry /fo Test.exe Entry.obj
链接成功。
原因分析
- 符号可见性差异:NASM生成Win64格式的COFF目标文件时,默认段内标签(如
Entry)是局部符号,仅在当前段内可见,不会导出为全局符号。MSVC的link.exe严格遵循COFF规范,只会查找全局可见的符号,因此无法识别未导出的Entry。 - GoLink的宽松规则:GoLink对符号查找的兼容性处理更灵活,即使是局部符号也能被识别为入口点,因此可以成功链接。
解决方法
修改汇编代码,添加global Entry声明,明确将Entry标记为全局可见符号:
global Entry extern ExitProcess segment Main Entry: push 0 call ExitProcess
重新用NASM汇编后,再使用MSVC的link.exe链接即可成功。
内容的提问来源于stack exchange,提问作者user21907176
相关产品推荐
相关产品推荐

