__gnu_linux__ 代表什么?

What does __gnu_linux__ stand for?

背景

我们有一些旧的 C++ 代码,其中包含只有在定义了预处理器符号 __gnu_linux__ 时才会编译的部分。使用 GCC 9.3 在我的 Ubuntu 20.04 上编译不是问题。现在,我们试图将其移植到基于 Alpine Linux 和 GCC 10.2 的 Docker 容器,并发现在这种情况下未定义 __gnu_linux__

因此,我搜索了有关 __gnu_linux__ 预处理器宏的任何文档,但在 GCC 或其预处理器 CPP 的文档中找不到任何内容。我能找到的唯一提示是以下预定义符号列表,但它没有提及任何文档:https://sourceforge.net/p/predef/wiki/OperatingSystems/

问题

目前研究

通过在 /usr 中进行全文搜索,我得到了一些结果。一个是 Boost 头文件,也查询该宏,另外两个是二进制文件 cc1cc1plus。我发现这些是 GCC 的内部工具,分别为 C 和 C++ 实现预处理器,但我找不到这些的任何官方文档。所以,我克隆了 GCC 源代码库,发现它在更改日志中只提到了一次 __gnu_linux__,并且包含一些特殊的提交,用 __gnu_linux__ 更改了一行,但是其中的 none对此作出明确声明。

参见gcc/config/linux.h

#define GNU_USER_TARGET_OS_CPP_BUILTINS()                       \
    do {                                                        \
        if (OPTION_GLIBC)                                       \
          builtin_define ("__gnu_linux__");                     \

因此它仅在使用 glibc 的 Linux 系统上定义。但是Alpine uses musl libc instead.

the commit中也提到:

(LINUX_TARGET_OS_CPP_BUILTINS): Define __gnu_linux__ only for GLIBC.