From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from latitanza.investici.org (latitanza.investici.org [82.94.249.234]) by sourceware.org (Postfix) with ESMTPS id 0BEA13858C66 for ; Wed, 2 Nov 2022 14:13:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0BEA13858C66 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=autistici.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=autistici.org Received: from 1.mail-backend.investici.org (unknown [10.0.0.11]) by latitanza.investici.org (Postfix) with ESMTP id 4N2TPk1YbvzGp3R; Wed, 2 Nov 2022 14:13:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=autistici.org; s=stigmate; t=1667398394; bh=SVczos8/cgbWTGXxIvTZIB5m89SsiNhnFGW1qETab1c=; h=Date:From:To:Subject:In-Reply-To:References:From; b=ixfoqPcRBp+T721x1q/88BEIDhkpbpeb7IvqAzRE40Kcl+67lY+1QjhqN5TS10W46 pmGu6wOT4DyUcXdOkLsoBkLJmztz+gmSo9YwyVYSYZFmTA9Ze7JOofqW6oipmTnXsL Klpo3Vy5VWVFFvK3ybifckZ2tfdnw5T2c6NqZyNI= Received: from 1.webmail.investici.org (localhost [127.0.0.1]) (Authenticated sender: i.nixman@autistici.org) by 1.mail-backend.investici.org (Postfix) with ESMTPA id 4N2TPk0JnGz5t7d; Wed, 2 Nov 2022 14:13:14 +0000 (UTC) MIME-Version: 1.0 Date: Wed, 02 Nov 2022 14:13:13 +0000 From: i.nixman@autistici.org To: Eli Zaretskii , gdb@sourceware.org Subject: Re: _WIN32_WINNT redefined? In-Reply-To: <8335b1bjv2.fsf@gnu.org> References: <6485dbfe07e21a1c451b17d3fda5b3d9@autistici.org> <41193fbdb742b1c2d4d7b4ab06561822@autistici.org> <8335b1bjv2.fsf@gnu.org> User-Agent: Roundcube Webmail Message-ID: X-Sender: i.nixman@autistici.org Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-3.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On 2022-11-02 12:50, Eli Zaretskii wrote: Hello Eli! I will try to explain step by step. the root of the issue: GDB wan't build using MinGW-W64 toolchain uses this patch: https://gcc.gnu.org/pipermail/libstdc++/2022-October/054895.html (for short, the patch provides the ability to libstdc++ to enable the support for std-threads and so on but without the need to use libwinpthreads: https://sourceforge.net/p/mingw-w64/mingw-w64/ci/master/tree/mingw-w64-libraries/winpthreads/) next, as I wrote earlier, I have faced with a trouble I can't build GDB using that path: ``` In file included from mingw64/lib/gcc/x86_64-w64-mingw32/13.0.0/include/c++/mutex:45, from ../src/gdb-11.2/gdbsupport/../gdbsupport/thread-pool.h:27, from ../src/gdb-11.2/gdbsupport/thread-pool.cc:24: mingw64/lib/gcc/x86_64-w64-mingw32/13.0.0/include/c++/bits/std_mutex.h:163:5: error: '__gthread_cond_t' does not name a type; did you mean '__gthread_once_t'? 163 | __gthread_cond_t* native_handle() noexcept { return &_M_cond; } | ^~~~~~~~~~~~~~~~ ``` because the patch requires the _WIN32_WINNT will be set to 0x0600 or greater. next, GDB's building process trying to build `gdbsupport/thread-pool.cc` which includes `common-defs.h` first. then, `gdbsupport/thread-pool.cc` includes `gdbsupport/thread-pool.h` which includes other standard headers like condition_variable/mutex/thread, etc. at this point the inclusion chain looks like this: `mutex`[1] -> `bits/std_mutex.h`[2] -> `bits/gthr.h`[3] -> `gthr-default.h`[4] [1] https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libstdc%2B%2B-v3/include/std/mutex;h=b310c15687d323c1750f717e630fbe0666515139;hb=HEAD [2] https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libstdc%2B%2B-v3/include/bits/std_mutex.h;h=b22e0e12793700291c65c1695313dbeae4561da2;hb=HEAD [3] https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libgcc/gthr.h;h=7943c94f6d16b7aed4269aa08db746ae131430b1;hb=HEAD (note for this link: in reality that file located inside gcc sources as `libgcc/gthr.h`, but on target toolchain it is `bits/gthr.h` without any changes) [4] https://pastebin.com/LbE0qbwu (note for this link: I paste that file on pastebin because I want to show you how looks that file after applying the patch) now look at the 4 link at line 65: `#if _WIN32_WINNT >= 0x0600` that is, in this case the definition from within the GDB sources "infects" the GCC sources. do you agree that this should not be the case? well, back to the root. please look at `gdbsupport/common-defs.h`: https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=gdbsupport/common-defs.h;h=e4985332e3f4016ccec2b2502dfe28bab16e2c92;hb=HEAD you may not believe me, but none of the inclusions above that preprocessor block I'm talking about include neither `windows.h` nor `winver.h` nothing that could tell to that preprocessor block the value of `_WIN32_WINNT` :) thus, it turns out that that preprocessor block of code does not check and does not correct the value of `_WIN32_WINNT` but simply always imposes its value. as solution I see two ways: 1) to remove that PP block completely, because as I wrote earlier - no one in the GDB sources refers to it. 2) to hide that PP block so that it cannot "infect" other code by by getting into public headers. best!