I see a hit for `_errno` from _setmbcp[1]:

```
(gdb) b _errno
Breakpoint 1 at 0x140002620
(gdb) r
Starting program: I:\crt-tests\init.exe
[New Thread 17720.0x3b9c]
[New Thread 17720.0x48c8]

Thread 1 hit Breakpoint 1.1, 0x00007ffbbc7d7454 in _errno () from 
C:\WINDOWS\SYSTEM32\msvcr110.dll
(gdb) bt
#0  0x00007ffbbc7d7454 in _errno () from C:\WINDOWS\SYSTEM32\msvcr110.dll
#1  0x00007ffbbc7f3825 in _setmbcp () from C:\WINDOWS\SYSTEM32\msvcr110.dll
#2  0x00007ffbbc7f34f2 in _ismbcl2_l () from C:\WINDOWS\SYSTEM32\msvcr110.dll
#3  0x00007ffbbc7d31a2 in exit () from C:\WINDOWS\SYSTEM32\msvcr110.dll
#4  0x00007ffbea39f96e in ntdll!RtlEncodeRemotePointer () from 
C:\WINDOWS\SYSTEM32\ntdll.dll
#5  0x00007ffbea24bcae in ntdll!RtlRaiseException () from 
C:\WINDOWS\SYSTEM32\ntdll.dll
#6  0x00007ffbea2497ac in ntdll!RtlDeleteElementGenericTableAvlEx () from 
C:\WINDOWS\SYSTEM32\ntdll.dll
#7  0x00007ffbea2d76ea in ntdll!LdrGetProcedureAddressForCaller () from 
C:\WINDOWS\SYSTEM32\ntdll.dll
#8  0x00007ffbea2d7716 in ntdll!LdrGetProcedureAddressForCaller () from 
C:\WINDOWS\SYSTEM32\ntdll.dll
#9  0x00007ffbea2fd8c6 in ntdll!EtwEventWriteNoRegistration () from 
C:\WINDOWS\SYSTEM32\ntdll.dll
#10 0x00007ffbea2fba50 in ntdll!EtwEventWriteNoRegistration () from 
C:\WINDOWS\SYSTEM32\ntdll.dll
#11 0x00007ffbea2fb83a in ntdll!EtwEventWriteNoRegistration () from 
C:\WINDOWS\SYSTEM32\ntdll.dll
#12 0x00007ffbea32910e in ntdll!LdrInitializeThunk () from 
C:\WINDOWS\SYSTEM32\ntdll.dll
#13 0x0000000000000000 in ?? ()
```

I think I see what's going on. I have UTF-8 enabled globally on my system and 
it seems that CRT attempts to set multibyte code page (with _setmbcp) to active 
ANSI code page (GetACP() == CP_UTF8, in my case), and since msvcr110.dll does 
not support UTF-8, its _setmbcp fails with EINVAL. (What's interesting is that 
it does not happen with msvcrt.dll.)

If I set a breakpoint for GetACP it will be hit in the same place.

- Kirill Makurin

[1] https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/setmbcp

________________________________
From: LIU Hao
Sent: Thursday, November 13, 2025 8:56 PM
To: [email protected]; Kirill Makurin
Cc: Pali Rohár
Subject: Re: [Mingw-w64-public] errno is set to EINVAL when entering main

在 2025-11-13 14:52, Kirill Makurin 写道:
> I wanted to quickly test whether library I'm working on builds and works with 
> msvcr*.dll, and when I was running the tests, I noticed that all tests for 
> C89/C95/uchar.h conversion functions failed. After small investigation I 
> realized that errno was to EINVAL upon entry to `main`.
>
> Can anyone look into this?

This doesn't reproduce the issue for me. You may try starting the program using 
GDB, with breakpoints on
`_errno` and `_set_errno`.


--
Best regards,
LIU Hao

_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to