Почему gcc показывает `unknown` в Target: x86_64-unknown-linux-gnu в Arch Linux?

12

Я хотел бы знать, почему, когда я работаю 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
noslin005
источник
Откуда вы установили этот gcc?
Фахим Митха
gccБыли установлены coreпакеты, когда я устанавливал Arch.
noslin005
Ok. Может быть, проверить инструкции по компиляции для этого пакета, тогда?
Фахим Митха

Ответы:

8

Как уже упоминалось в комментарии, по умолчанию целевой триплет генерируется скриптом 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

Эти строки объединяются и сопоставляются с жестко закодированными узорами. Результат также жестко закодирован:

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 по умолчанию: обновленный config.guess в исходном хранилище.

Михаил Мальцев
источник
Удивительно, что GCC 6 развивается.
Активист
OMG, поэтому unknownпо умолчанию жестко закодирован.
Активист
4

Это часть производителя триплета конфигурации / цели. Об этом говорится в автобуке :

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

Руководство Autoconf называет это company.

Я не специалист по компиляции с GCC, но похоже, что информация, предоставленная этим полем, носит информационный характер и unknownявляется просто значением по умолчанию, используемым GCC, если явно не перезаписано. GCC в Ubuntu 12.04, например, использует x86_64-linux-gnuDebian 7s GCC i486-linux-gnu, поэтому вполне можно оставить поле пустым.

Wieland
источник
Вот и все. x86_64-linux-gnuРазнообразие являются ярлык цели, стоя на x86_64-unknown-linux-gnuили x86_64-pc-linux-gnu. gcc -vпоказывает цель, для которой он был скомпилирован, и config.subдает канонический триплет (ищите его в /usr/share/miscсистемах на основе Debian с autotools-devустановленными).
Стивен Китт