On Sunday 13 July 2025 21:19:08 LIU Hao wrote:
> 在 2025-7-13 21:06, Pali Rohár 写道:
> > Ok. Thanks for info. And what in the case if mingw-w64 is compiled with
> > gcc-8 together with -fstack-protector in CFLAGS?
>
> It may be a default option of an environment.
>
> For example in MSYS2 when building a native package with `makepkg-mingw` the
> default flags are defined in
> 'C:\MSYS64\etc\makepkg_mingw.d\${MSYSTEM}.conf', and in CFLAGS there's
> `-fstack-protector-strong`. Those flags are disabled with `!buildflags` in
> PKGBUILD when building the CRT.
That gcc 8.3 supports -fstack-protector-all flag.
When the file stack_chk_guard.c is compiled without that flag it emits
following code:
00000000 <_init>:
0: 83 3d 00 00 00 00 00 cmpl $0x0,0x0
2: dir32 ___stack_chk_guard-0x4
7: 75 2c jne 35 <_init+0x35>
9: 55 push %ebp
a: 89 e5 mov %esp,%ebp
c: 83 ec 28 sub $0x28,%esp
f: 8d 45 f4 lea -0xc(%ebp),%eax
12: 89 04 24 mov %eax,(%esp)
15: ff 15 00 00 00 00 call *0x0
17: dir32 __imp__rand_s
1b: 85 c0 test %eax,%eax
1d: 75 0a jne 29 <_init+0x29>
1f: 8b 45 f4 mov -0xc(%ebp),%eax
22: a3 00 00 00 00 mov %eax,0x0
23: dir32 ___stack_chk_guard-0x4
27: eb 0a jmp 33 <_init+0x33>
29: c7 05 00 00 00 00 ef movl $0xdeadbeef,0x0
30: be ad de
2b: dir32 ___stack_chk_guard-0x4
33: c9 leave
34: c3 ret
35: c3 ret
36: 90 nop
37: 90 nop
And when it is compiled with the -fstack-protector-all flag it emits:
00000000 <_init>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 28 sub $0x28,%esp
6: a1 00 00 00 00 mov 0x0,%eax
7: dir32 ___stack_chk_guard-0x4
b: 89 45 f4 mov %eax,-0xc(%ebp)
e: 31 c0 xor %eax,%eax
10: 83 3d 00 00 00 00 00 cmpl $0x0,0x0
12: dir32 ___stack_chk_guard-0x4
17: 75 24 jne 3d <_init+0x3d>
19: 8d 45 f0 lea -0x10(%ebp),%eax
1c: 89 04 24 mov %eax,(%esp)
1f: ff 15 00 00 00 00 call *0x0
21: dir32 __imp__rand_s
25: 85 c0 test %eax,%eax
27: 75 0a jne 33 <_init+0x33>
29: 8b 45 f0 mov -0x10(%ebp),%eax
2c: a3 00 00 00 00 mov %eax,0x0
2d: dir32 ___stack_chk_guard-0x4
31: eb 0a jmp 3d <_init+0x3d>
33: c7 05 00 00 00 00 ef movl $0xdeadbeef,0x0
3a: be ad de
35: dir32 ___stack_chk_guard-0x4
3d: 8b 45 f4 mov -0xc(%ebp),%eax
40: 33 05 00 00 00 00 xor 0x0,%eax
42: dir32 ___stack_chk_guard-0x4
46: 74 05 je 4d <_init+0x4d>
48: e8 00 00 00 00 call 4d <_init+0x4d>
49: DISP32 ___stack_chk_fail
4d: c9 leave
4e: c3 ret
4f: 90 nop
And throws warning: ‘no_stack_protector’ attribute directive ignored
[-Wattributes]
If I understand correctly the code at 3d-4c is the stack protection
check, which should have been disabled for that function. But because
the ___stack_chk_guard is being changed in the function, it cause
calling the ___stack_chk_fail.
So the warning is NOT harmless and cannot be ignored. It is a real issue.
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public