master
  1#include "func.def.in"
  2
  3#define ADD_UNDERSCORE(symbol) symbol == _ ## symbol
  4#define ADD_UNDERSCORE_DATA(symbol) symbol DATA == _ ## symbol
  5#define ADD_UNDERSCORE_DATA_DLL(symbol) symbol DATA == _ ## symbol ## _dll
  6#define ADD_DOUBLE_UNDERSCORE(symbol) symbol == __ ## symbol
  7
  8; This is list of symbol aliases from the Visual C++ 1.0 oldnames.lib library
  9; FIXME: some of these symbol aliases are commented, check and document why
 10#ifdef UCRTBASE
 11; access is provided as an alias for __mingw_access
 12#else
 13ADD_UNDERSCORE(access)
 14#endif
 15#ifndef CRTAPP
 16; ADD_UNDERSCORE(cgets)
 17ADD_UNDERSCORE(chdir)
 18#endif
 19ADD_UNDERSCORE(chmod)
 20ADD_UNDERSCORE(chsize)
 21ADD_UNDERSCORE(close)
 22#ifndef CRTAPP
 23; ADD_UNDERSCORE(cprintf)
 24; ADD_UNDERSCORE(cputs)
 25#endif
 26ADD_UNDERSCORE(creat)
 27#ifndef CRTAPP
 28; ADD_UNDERSCORE(cscanf)
 29ADD_UNDERSCORE(cwait)
 30#endif
 31#if defined(UCRTBASE)
 32; daylight variable is provided by misc/ucrt_tzset.c
 33#elif defined(CRTDLL)
 34ADD_UNDERSCORE_DATA_DLL(daylight)
 35#else
 36ADD_UNDERSCORE_DATA(daylight)
 37#endif
 38ADD_UNDERSCORE(dup)
 39ADD_UNDERSCORE(dup2)
 40ADD_UNDERSCORE(ecvt)
 41#if defined(UCRTBASE)
 42; _environ variable is not available in ucrtbase.dll and there is no replacement for it
 43#elif defined(CRTDLL)
 44; ADD_UNDERSCORE_DATA_DLL(environ)
 45#else
 46; ADD_UNDERSCORE_DATA(environ)
 47#endif
 48ADD_UNDERSCORE(eof)
 49#ifndef CRTAPP
 50ADD_UNDERSCORE(execl)
 51ADD_UNDERSCORE(execle)
 52ADD_UNDERSCORE(execlp)
 53ADD_UNDERSCORE(execlpe)
 54ADD_UNDERSCORE(execv)
 55ADD_UNDERSCORE(execve)
 56ADD_UNDERSCORE(execvp)
 57ADD_UNDERSCORE(execvpe)
 58#endif
 59ADD_UNDERSCORE(fcloseall)
 60ADD_UNDERSCORE(fcvt)
 61ADD_UNDERSCORE(fdopen)
 62ADD_UNDERSCORE(fgetchar)
 63ADD_UNDERSCORE(filelength)
 64ADD_UNDERSCORE(fileno)
 65; ADD_UNDERSCORE(flushall)
 66ADD_UNDERSCORE(fputchar)
 67#ifdef FIXED_SIZE_SYMBOLS
 68#ifndef CRTDLL
 69ADD_UNDERSCORE(fstat)
 70#endif
 71#else
 72F32(fstat == _fstat32)
 73F64(fstat == _fstat64i32)
 74#endif
 75#ifdef FIXED_SIZE_SYMBOLS
 76ADD_UNDERSCORE(ftime)
 77#else
 78F32(ftime == _ftime32)
 79F64(ftime == _ftime64)
 80#endif
 81#if defined(UCRTBASE)
 82; HUGE alias and _HUGE variable are provided by math/_huge.c
 83#elif defined(CRTDLL)
 84ADD_UNDERSCORE_DATA_DLL(HUGE)
 85#else
 86ADD_UNDERSCORE_DATA(HUGE)
 87#endif
 88ADD_UNDERSCORE(gcvt)
 89#ifndef CRTAPP
 90ADD_UNDERSCORE(getch)
 91ADD_UNDERSCORE(getche)
 92ADD_UNDERSCORE(getcwd)
 93#endif
 94#ifdef UCRTBASE
 95; ucrtbase.dll has got _getpid for all archs
 96ADD_UNDERSCORE(getpid)
 97#elif !defined(CRTAPP)
 98; msvcrt.dll for arm/arm64 lacks _getpid
 99F_X86_ANY(ADD_UNDERSCORE(getpid))
100#endif
101#ifndef CRTAPP
102ADD_UNDERSCORE(getw)
103#endif
104ADD_UNDERSCORE(isatty)
105ADD_UNDERSCORE(itoa)
106#ifndef CRTAPP
107ADD_UNDERSCORE(kbhit)
108#endif
109ADD_UNDERSCORE(lfind)
110; ADD_UNDERSCORE(locking)
111ADD_UNDERSCORE(lsearch)
112ADD_UNDERSCORE(lseek)
113ADD_UNDERSCORE(ltoa)
114ADD_UNDERSCORE(memccpy)
115ADD_UNDERSCORE(memicmp)
116ADD_UNDERSCORE(mkdir)
117ADD_UNDERSCORE(mktemp)
118; onexit function alias is provided by misc/_onexit.c
119ADD_UNDERSCORE(open)
120#ifndef CRTAPP
121ADD_UNDERSCORE(putch)
122ADD_UNDERSCORE(putenv)
123#endif
124ADD_UNDERSCORE(putw)
125ADD_UNDERSCORE(read)
126ADD_UNDERSCORE(rmdir)
127ADD_UNDERSCORE(rmtmp)
128ADD_UNDERSCORE(setmode)
129ADD_UNDERSCORE(sopen)
130#ifndef CRTAPP
131ADD_UNDERSCORE(spawnl)
132ADD_UNDERSCORE(spawnle)
133ADD_UNDERSCORE(spawnlp)
134ADD_UNDERSCORE(spawnlpe)
135ADD_UNDERSCORE(spawnv)
136ADD_UNDERSCORE(spawnve)
137ADD_UNDERSCORE(spawnvp)
138ADD_UNDERSCORE(spawnvpe)
139#endif
140#ifdef UCRTBASE
141F32(stat == _stat32)
142F64(stat == _stat64i32)
143#else
144; stat for non-UCRT is provided by mingw to workaround trailing slash issue in _stat
145#endif
146#ifdef NO_STRCMPI_ALIAS
147; Symbol _strcmpi is natively present and defined in the library def file
148; So define strcmpi as an alias to _strcmpi
149ADD_UNDERSCORE(strcmpi)
150#else
151; Symbol _strcmpi is not present in the library, it provides only _stricmp symbol
152; So define strcmpi as an alias to _stricmp
153strcmpi == _stricmp
154#endif
155ADD_UNDERSCORE(strdup)
156ADD_UNDERSCORE(stricmp)
157ADD_UNDERSCORE(strlwr)
158ADD_UNDERSCORE(strnicmp)
159ADD_UNDERSCORE(strnset)
160ADD_UNDERSCORE(strrev)
161ADD_UNDERSCORE(strset)
162ADD_UNDERSCORE(strupr)
163ADD_UNDERSCORE(swab)
164#if defined(UCRTBASE)
165; _sys_errlist variable is not available in ucrtbase.dll and there is no replacement for it
166#else
167// sys_errlist variable is without _dll suffix in crtdll.dll
168; ADD_UNDERSCORE_DATA(sys_errlist)
169#endif
170#if defined(UCRTBASE)
171; _sys_nerr variable is not available in ucrtbase.dll and there is no replacement for it
172#elif defined(CRTDLL)
173; ADD_UNDERSCORE_DATA_DLL(sys_nerr)
174#else
175; ADD_UNDERSCORE_DATA(sys_nerr)
176#endif
177ADD_UNDERSCORE(tell)
178ADD_UNDERSCORE(tempnam)
179#if defined(UCRTBASE)
180; timezone variable is provided by misc/ucrt_tzset.c
181#elif defined(CRTDLL)
182ADD_UNDERSCORE_DATA_DLL(timezone)
183#else
184ADD_UNDERSCORE_DATA(timezone)
185#endif
186#if defined(UCRTBASE)
187; tzname variable is provided by misc/ucrt_tzset.c
188#else
189// tzname variable is without _dll suffix in crtdll.dll
190ADD_UNDERSCORE_DATA(tzname)
191#endif
192#if defined(UCRTBASE)
193; tzset function is provided by misc/ucrt_tzset.c
194#else
195ADD_UNDERSCORE(tzset)
196#endif
197; ADD_UNDERSCORE(ultoa)
198ADD_UNDERSCORE(umask)
199#ifndef CRTAPP
200ADD_UNDERSCORE(ungetch)
201#endif
202ADD_UNDERSCORE(unlink)
203#ifdef FIXED_SIZE_SYMBOLS
204ADD_UNDERSCORE(utime)
205#else
206F32(utime == _utime32)
207F64(utime == _utime64)
208#endif
209ADD_UNDERSCORE(write)
210
211; This is list of symbol aliases added in the Visual C++ 2.0 oldnames.lib library
212; All these symbols with leading underscore are present also in pre-2.0 CRT versions: crtdll.dll and msvcrt10.dll
213; ADD_UNDERSCORE(control87)
214#if __SIZEOF_LONG_DOUBLE__ == __SIZEOF_DOUBLE__
215ADD_UNDERSCORE(fpreset)
216#else
217; ADD_UNDERSCORE(fpreset) ; Alias fpreset is set in CRT_fp10.c and CRT_fp8.c
218#endif
219ADD_UNDERSCORE(wcsdup)
220ADD_UNDERSCORE(wcsicmp)
221ADD_UNDERSCORE(wcsicoll)
222ADD_UNDERSCORE(wcslwr)
223ADD_UNDERSCORE(wcsnicmp)
224ADD_UNDERSCORE(wcsnset)
225ADD_UNDERSCORE(wcsrev)
226ADD_UNDERSCORE(wcsset)
227ADD_UNDERSCORE(wcsupr)
228
229; This is list of symbol aliases added in the Visual C++ 4.0 oldnames.lib library
230; All these symbols with leading underscore are present also in pre-4.0 CRT versions: crtdll.dll, msvcrt10.dll and msvcrt20.dll
231; ADD_UNDERSCORE(cabs)
232#ifdef UCRTBASE
233; hypot is natively exported from UCRT
234#else
235ADD_UNDERSCORE(hypot)
236#endif
237ADD_UNDERSCORE(j0)
238ADD_UNDERSCORE(j1)
239ADD_UNDERSCORE(jn)
240ADD_UNDERSCORE(y0)
241ADD_UNDERSCORE(y1)
242ADD_UNDERSCORE(yn)
243
244; This is list of symbol aliases for C95 functions
245#ifdef WITH_GET_PUT_WCHAR_ALIASES
246getwc == fgetwc
247getwchar == _fgetwchar
248putwc == fputwc
249putwchar == _fputwchar
250#endif
251#ifdef USE_WCSTOK_S_FOR_WCSTOK
252wcstok == wcstok_s
253#endif
254
255; This is list of symbol aliases for C99 functions
256; ADD_UNDERSCORE(logb)
257#ifdef WITH_NEXTAFTER_ALIAS
258ADD_UNDERSCORE(nextafter)
259#endif
260
261; This is list of symbol aliases for C99 ARM long double functions
262; They are defined as aliases to regular double symbols as on ARM, long double is equal to regular double
263F_LD64(acosl == acos)
264F_LD64(asinl == asin)
265F_LD64(atan2l == atan2)
266F_LD64(atanl == atan)
267F_LD64(ceill == ceil)
268F_LD64(cosl == cos)
269F_LD64(expl == exp)
270F_LD64(floorl == floor)
271F_LD64(fmodl == fmod)
272F_LD64(log10l == log10)
273F_LD64(logl == log)
274; FIXME: Why is powl alias defined only for UCRT?
275#ifdef UCRTBASE
276F_LD64(powl == pow)
277#endif
278F_LD64(sinl == sin)
279F_LD64(tanl == tan)
280F_LD64(_chgsignl == _chgsign)
281
282; This is list of symbol aliases for C11 functions
283#ifdef UCRTBASE
284F32(timespec_get == _timespec32_get)
285F64(timespec_get == _timespec64_get)
286#endif
287
288; This is list of symbol aliases for POSIX functions
289ADD_DOUBLE_UNDERSCORE(isascii)
290ADD_DOUBLE_UNDERSCORE(toascii)
291#ifndef CRTAPP
292ADD_UNDERSCORE(pclose)
293ADD_UNDERSCORE(popen)
294#endif
295; ADD_UNDERSCORE(scalb)
296
297; This is list of symbol aliases for Large File Specification (extension to Single UNIX Specification)
298#ifndef NO_FPOS64_ALIASES
299; fgetpos and fsetpos are already 64-bit
300fgetpos64 == fgetpos
301fsetpos64 == fsetpos
302#endif
303#ifdef UCRTBASE
304stat32 == _stat32
305stat32i64 == _stat32i64
306stat64 == _stat64
307stat64i32 == _stat64i32
308#else
309; stat for non-UCRT is provided by mingw to workaround trailing slash issue in _stat
310#endif
311#ifdef FIXED_SIZE_SYMBOLS
312// NO_FIXED_SIZE_64_ALIAS means that DLL provides the native _fstat64 symbol
313#if defined(NO_FIXED_SIZE_64_ALIAS) && !defined(NO_FSTAT64_ALIAS)
314fstat64 == _fstat64
315#endif
316#else
317fstat64 == _fstat64
318#endif
319
320; This is list of symbol aliases for GNU functions which are not part of POSIX or ISO C
321strcasecmp == _stricmp
322strncasecmp == _strnicmp
323
324; This is list of various symbol aliases which are needed for compatibility
325; Some symbols in some version of CRT library were added and some other symbols were removed or renamed
326; This list provides some level of backward and forward compatibility
327
328#ifndef NO_STRCMPI_ALIAS
329_strcmpi == _stricmp
330#endif
331
332#ifdef WITH_IOB_FUNC_ALIAS
333__iob_func == __p__iob
334#endif
335
336#ifdef WITH_TZ_ALIASES
337__daylight == __p__daylight
338#ifndef NO_DSTBIAS
339__dstbias == __p__dstbias
340#endif
341__timezone == __p__timezone
342__tzname == __p__tzname
343#endif
344
345#ifdef WITH_ATOLL_ALIAS
346atoll == _atoi64
347_wtoll == _wtoi64
348#endif
349
350#ifdef WITH_ATOLL_L_ALIAS
351_atoll_l == _atoi64_l
352_wtoll_l == _wtoi64_l
353#endif
354
355#ifdef WITH_LLABS_ALIAS
356llabs == _abs64
357imaxabs == _abs64
358#elif defined(WITH_IMAXABS_ALIAS)
359imaxabs == llabs
360#endif
361
362#ifdef WITH_IMAXDIV_ALIAS
363imaxdiv == lldiv
364#endif
365
366#ifdef WITH_STRTO64_ALIAS
367strtoll == _strtoi64
368strtoull == _strtoui64
369strtoimax == _strtoi64
370strtoumax == _strtoui64
371wcstoll == _wcstoi64
372wcstoull == _wcstoui64
373wcstoimax == _wcstoi64
374wcstoumax == _wcstoui64
375#endif
376
377#ifdef WITH_STRTO64_L_ALIAS
378_strtoll_l == _strtoi64_l
379_strtoull_l == _strtoui64_l
380_strtoimax_l == _strtoi64_l
381_strtoumax_l == _strtoui64_l
382_wcstoll_l == _wcstoi64_l
383_wcstoull_l == _wcstoui64_l
384_wcstoimax_l == _wcstoi64_l
385_wcstoumax_l == _wcstoui64_l
386#endif
387
388; This is list of find symbol aliases, every CRT library has either find symbols with SIZE suffix or without them
389#ifdef FIXED_SIZE_SYMBOLS
390F32(_findfirst32 == _findfirst)
391F64(_findfirst64i32 == _findfirst)
392#ifndef NO_I64_FIXED_SIZE
393F32(_findfirst32i64 == _findfirsti64)
394#ifndef NO_FIXED_SIZE_64_ALIAS
395F64(_findfirst64 == _findfirsti64)
396#endif
397#endif
398F32(_findnext32 == _findnext)
399F64(_findnext64i32 == _findnext)
400#ifndef NO_I64_FIXED_SIZE
401F32(_findnext32i64 == _findnexti64)
402#ifndef NO_FIXED_SIZE_64_ALIAS
403F64(_findnext64 == _findnexti64)
404#endif
405#endif
406#ifndef NO_WIDE_FIXED_SIZE
407F32(_wfindfirst32 == _wfindfirst)
408F64(_wfindfirst64i32 == _wfindfirst)
409#ifndef NO_I64_FIXED_SIZE
410F32(_wfindfirst32i64 == _wfindfirsti64)
411#ifndef NO_FIXED_SIZE_64_ALIAS
412F64(_wfindfirst64 == _wfindfirsti64)
413#endif
414#endif
415F32(_wfindnext32 == _wfindnext)
416F64(_wfindnext64i32 == _wfindnext)
417#ifndef NO_I64_FIXED_SIZE
418F32(_wfindnext32i64 == _wfindnexti64)
419#ifndef NO_FIXED_SIZE_64_ALIAS
420F64(_wfindnext64 == _wfindnexti64)
421#endif
422#endif
423#endif
424#else
425F32(_findfirst == _findfirst32)
426F64(_findfirst == _findfirst64i32)
427F32(_findfirsti64 == _findfirst32i64)
428F64(_findfirsti64 == _findfirst64)
429F32(_findnext == _findnext32)
430F64(_findnext == _findnext64i32)
431F32(_findnexti64 == _findnext32i64)
432F64(_findnexti64 == _findnext64)
433F32(_wfindfirst == _wfindfirst32)
434F64(_wfindfirst == _wfindfirst64i32)
435F32(_wfindfirsti64 == _wfindfirst32i64)
436F64(_wfindfirsti64 == _wfindfirst64)
437F32(_wfindnext == _wfindnext32)
438F64(_wfindnext == _wfindnext64i32)
439F32(_wfindnexti64 == _wfindnext32i64)
440F64(_wfindnexti64 == _wfindnext64)
441#endif
442
443; This is list of stat symbol aliases, every CRT library has either stat symbols with SIZE suffix or without them
444#ifdef FIXED_SIZE_SYMBOLS
445#ifndef CRTDLL
446F32(_fstat32 == _fstat)
447#endif
448F64(_fstat64i32 == _fstat)
449#ifndef NO_I64_FIXED_SIZE
450F32(_fstat32i64 == _fstati64)
451#ifndef NO_FIXED_SIZE_64_ALIAS
452F64(_fstat64 == _fstati64)
453#endif
454#endif
455#ifndef CRTDLL
456F32(_stat32 == _stat)
457#endif
458F64(_stat64i32 == _stat)
459#ifndef NO_I64_FIXED_SIZE
460F32(_stat32i64 == _stati64)
461#ifndef NO_FIXED_SIZE_64_ALIAS
462F64(_stat64 == _stati64)
463#endif
464#endif
465#ifndef NO_WIDE_FIXED_SIZE
466F32(_wstat32 == _wstat)
467F64(_wstat64i32 == _wstat)
468#ifndef NO_I64_FIXED_SIZE
469F32(_wstat32i64 == _wstati64)
470#ifndef NO_FIXED_SIZE_64_ALIAS
471F64(_wstat64 == _wstati64)
472#endif
473#endif
474#endif
475#else
476F32(_fstat == _fstat32)
477F64(_fstat == _fstat64i32)
478F32(_fstati64 == _fstat32i64)
479F64(_fstati64 == _fstat64)
480F32(_stat == _stat32)
481F64(_stat == _stat64i32)
482F32(_stati64 == _stat32i64)
483F64(_stati64 == _stat64)
484F32(_wstat == _wstat32)
485F64(_wstat == _wstat64i32)
486F32(_wstati64 == _wstat32i64)
487F64(_wstati64 == _wstat64)
488#endif
489
490; This is list of time symbol aliases, every CRT library except msvcrt.dll has either time symbols with SIZE suffix or without them
491#ifndef NO_TIME_ALIAS
492#ifdef FIXED_SIZE_SYMBOLS
493F32(_ctime32 == ctime)
494F64(_ctime64 == ctime)
495F32(_difftime32 == difftime)
496F64(_difftime64 == difftime)
497F32(_ftime32 == _ftime)
498F64(_ftime64 == _ftime)
499F32(_futime32 == _futime)
500F64(_futime64 == _futime)
501F32(_gmtime32 == gmtime)
502F64(_gmtime64 == gmtime)
503F32(_localtime32 == localtime)
504F64(_localtime64 == localtime)
505; Skip _mkgmtime as it is present only in msvcrt.dll
506F32(_mktime32 == mktime)
507F64(_mktime64 == mktime)
508F32(_time32 == time)
509F64(_time64 == time)
510F32(_utime32 == _utime)
511F64(_utime64 == _utime)
512#ifndef NO_WIDE_FIXED_SIZE
513F32(_wctime32 == _wctime)
514F64(_wctime64 == _wctime)
515F32(_wutime32 == _wutime)
516F64(_wutime64 == _wutime)
517#endif
518#else
519F32(ctime == _ctime32)
520F64(ctime == _ctime64)
521F32(difftime == _difftime32)
522F64(difftime == _difftime64)
523F32(_ftime == _ftime32)
524F64(_ftime == _ftime64)
525F32(_futime == _futime32)
526F64(_futime == _futime64)
527F32(gmtime == _gmtime32)
528F64(gmtime == _gmtime64)
529F32(localtime == _localtime32)
530F64(localtime == _localtime64)
531F32(_mkgmtime == _mkgmtime32)
532F64(_mkgmtime == _mkgmtime64)
533F32(mktime == _mktime32)
534F64(mktime == _mktime64)
535F32(time == _time32)
536F64(time == _time64)
537F32(_utime == _utime32)
538F64(_utime == _utime64)
539F32(_wctime == _wctime32)
540F64(_wctime == _wctime64)
541F32(_wutime == _wutime32)
542F64(_wutime == _wutime64)
543#endif
544#endif
545
546; This is list of symbols which are present in msvcrt but not in UCRT
547#ifdef UCRTBASE
548__lconv_init == __initialize_lconv_for_unsigned_char
549__set_app_type == _set_app_type
550__p__daylight == __daylight
551__p__dstbias == __dstbias
552__p__timezone == __timezone
553__p__tzname == __tzname
554#endif
555
556; This is list of printf/scanf symbol aliases with __ms_ prefix
557#ifndef UCRTBASE
558__ms_fprintf == fprintf
559__ms_fscanf == fscanf
560__ms_fwprintf == fwprintf
561__ms_fwscanf == fwscanf
562__ms_printf == printf
563__ms_scanf == scanf
564__ms_sprintf == sprintf
565__ms_sscanf == sscanf
566__ms_swscanf == swscanf
567__ms_vfprintf == vfprintf
568__ms_vfwprintf == vfwprintf
569__ms_vprintf == vprintf
570__ms_vsprintf == vsprintf
571__ms_vwprintf == vwprintf
572__ms_wprintf == wprintf
573__ms_wscanf == wscanf
574#endif
575
576; This is list of additional symbol aliases not available in any library as neither native symbols nor aliases
577; FIXME: check if these really are needed
578
579; This is wstat and wstat64 symbol available only in mingw but for a long time
580#ifdef UCRTBASE
581F32(wstat == _wstat32)
582F64(wstat == _wstat64i32)
583wstat32 == _wstat32
584wstat32i64 == _wstat32i64
585wstat64 == _wstat64
586wstat64i32 == _wstat64i32
587#else
588; wstat for non-UCRT is provided by mingw to workaround trailing slash issue in _wstat
589#endif
590
591; Origin of the symbol wcscmpi is unknown. This symbol is not present in
592; crtdll.dll and neither in any msvcr* version. The only source of wcscmpi is
593; wcstr.h header file from the Microsoft Visual C++ 1.0 (32-bit for NT) and
594; Microsoft Windows NT 3.1 SDK where wcscmpi and _wcscmpi are defined as
595; macros which expand to _wcsicmp. So the raw wcscmpi is not linkable symbol
596; even in the old Visual C++ versions.
597wcscmpi == _wcsicmp
598
599; Origin of these symbols is unknown too.
600ADD_UNDERSCORE(chgsign)
601ADD_UNDERSCORE(fgetwchar)
602ADD_UNDERSCORE(finite)
603ADD_UNDERSCORE(fpclass)
604ADD_UNDERSCORE(fputwchar)
605#ifndef CRTAPP
606ADD_UNDERSCORE(heapwalk)
607#endif
608ADD_DOUBLE_UNDERSCORE(iscsymf)
609ADD_DOUBLE_UNDERSCORE(iscsym)
610#ifndef CRTAPP
611ADD_UNDERSCORE(searchenv)
612#endif
613ADD_UNDERSCORE(stricoll)
614#ifndef UCRTBASE
615ADD_UNDERSCORE(vsnprintf_s)
616#endif
617#ifndef CRTAPP
618ADD_UNDERSCORE(wpopen)
619#endif