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

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

我想知道为什么当我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

而在其他发行版中,例如 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

答案1

正如评论中已经提到的,默认情况下目标三元组是由配置.猜测脚本。它的逻辑相当简单。首先它用于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

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

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

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

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

$ 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

默认情况下,GCC 6 可能会输出 x86_64-pc-linux-gnu:更新了配置.猜测在上游存储库中。

答案2

这是配置/目标三元组的制造商部分。这自动预订对此说道:

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'.

自动配置手册称之为company.

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

相关内容