为什么 gcc 在 Target: x86_64-unknown-linux-gnu 中显示 `unknown` 在 Arch Linux 中?

nos*_*005 14 linux arch-linux gcc

我想知道为什么当我gcc -v在 Arch Linux 下运行时,它unknown在这些输出中显示这个词:

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/5.1.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Run Code Online (Sandbox Code Playgroud)

而在其他发行版中,例如 ubuntu,它显示发行版名称,例如ubuntu

 Using built-in specs.
 COLLECT_GCC=gcc
 COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-ubuntu-linux-gnu/5.1.0/lto-wrapper
 Target: x86_64-ubuntu-linux-gnu
Run Code Online (Sandbox Code Playgroud)

小智 10

正如评论中已经提到的,默认情况下,目标三元组由config.guess脚本生成。它的逻辑相当简单。首先它uname用来获取一些基本的系统信息:

UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
Run Code Online (Sandbox Code Playgroud)

这些字符串被组合并与硬编码模式匹配。结果也是硬编码的:

case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
...(snip)...
    x86_64:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
...(snip)...
Run Code Online (Sandbox Code Playgroud)

对于某些系统,可以给出更有意义的结果,例如“rs6000-ibm-aix”中的 IBM。

分发维护者只需用他们自己的(也是硬编码的)覆盖这个字符串:

$ gcc -v
...(snip)...
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.9.2-10'
...(snip)...
--target=x86_64-linux-gnu
Run Code Online (Sandbox Code Playgroud)

默认情况下,GCC 6 可能会输出 x86_64-pc-linux-gnu:更新上游存储库中的config.guess


Wie*_*and 6

这是配置/目标三元组的制造商部分。Autobook对此有这样的描述

manufacturer
   A somewhat freeform field which indicates the manufacturer of the system. This is often simply `unknown'. Other common strings are `pc' for an IBM PC compatible system, or the name of a workstation vendor, such as `sun'.
Run Code Online (Sandbox Code Playgroud)

autoconf手册称其为company

我不是 GCC 编译方面的专家,但听起来该字段提供的信息更多的是信息性质,unknown只是 GCC 使用的默认值,除非显式覆盖。例如x86_64-linux-gnu,Ubuntu 12.04 上的 GCC 使用 Debian 7s GCC i486-linux-gnu,因此完全可以将该字段留空。