environment: windows 10. happen using mingw version of ld
linking, i'm happy use visual studio link.exe
if makes things simpler.
i have following basic program in nasm:
global _main extern _printf section .text _main: push message call _printf add esp, 4 ret message: db 'hello, world', 10, 0
and builds fine using
nasm -f win32 test.nasm
when trying link windows crt (ucrt.lib), following error:
$ ld -o test.exe test.obj test.obj:test.nasm:(.text+0x6): undefined reference `printf'
ok, need point linker @ ucrt library:
$ ld -o test.exe /c/program\ files\ \(x86\)/windows\ kits/10/lib/10.0.14393.0/ucrt/x86/ucrt.lib test.obj test.obj:test.nasm:(.text+0x6): undefined reference `printf'
trying equivalent visual studio linker:
d:\code\nasm>link -out:test.exe -entry:main -subsystem:console test.obj microsoft (r) incremental linker version 14.10.25017.0 copyright (c) microsoft corporation. rights reserved. test.obj : error lnk2001: unresolved external symbol _printf test.exe : fatal error lnk1120: 1 unresolved externals
this raises couple of questions:
why 1 of these try find
printf
, other,_printf
? there's underscore convention, doesn't seem understood both linkers.i used
objdump -t
@ symbols in ucrt.lib file. won't paste entire list, contains entries such as:
[ 4](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __imp____conio_common_vcprintf
[ 5](sec 3)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 ___conio_common_vcprintf
[ 4](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __imp____conio_common_vcprintf_p
neither printf
nor _printf
appears in list. mean it's not exported library? if not, library should linking?
according this ms article, ucrt.lib
de-facto library c runtime , c standard library.
thanks comment michael petch, looks need manually link 1 or more libs in separate location ucrt.lib
library. relevant 1 printf legacy_stdio_definitions.lib
, found deep in sub-dir of vs2017 install directory, opposed ucrt.lib
in windows sdk install directory.
the definition of printf
provided inline in stdio.h
unless macro _no_crt_stdio_inline
defined, guess when building inside vs toolchain.
Comments
Post a Comment