Pourquoi gcc affiche `unknown` dans Target: x86_64-unknown-linux-gnu dans Arch Linux?

12

Je voudrais savoir pourquoi lorsque je tourne gcc -vsous Arch Linux, cela montre le unknownmot dans ces sorties:

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

tandis que dans une autre distribution, comme ubuntu, il affiche le nom de la distribution, comme 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
la source
D'où avez-vous installé ce gcc?
Faheem Mitha
gccont été installés avec les corepackages lors de l'installation d'Arch.
noslin005
D'accord. Peut-être vérifiez les instructions de compilation pour ce paquet, alors?
Faheem Mitha

Réponses:

8

Comme cela a déjà été mentionné dans le commentaire, par défaut, le triplet cible est généré par le script config.guess . Sa logique est assez simple. Il utilise unamed' abord pour obtenir des informations système de base:

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

Ces chaînes sont combinées et mises en correspondance avec des modèles codés en dur. Le résultat est également codé en dur:

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

Pour certains systèmes, il est possible de donner un résultat plus significatif, comme IBM dans "rs6000-ibm-aix".

Les responsables de la distribution remplacent simplement cette chaîne par leur propre chaîne (également codée en dur):

$ 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 affichera probablement x86_64-pc-linux-gnu par défaut: config.guess mis à jour dans le référentiel en amont.

Mikhail Maltsev
la source
Incroyable que GCC 6 se développe.
2015
OMG, unknownest donc codé en dur par défaut.
acgtyrant
4

C'est la partie constructeur du triplet configuration / cible. L' Autobook dit à ce sujet:

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

Le manuel autoconf l' appelle company.

Je ne suis pas un expert de la compilation avec GCC, mais il semble que les informations fournies par ce champ soient davantage de nature informative et ne unknownsoient que la valeur par défaut que GCC utilise, sauf si elles sont écrasées explicitement. GCC sur Ubuntu 12.04 utilise par exemple x86_64-linux-gnu, Debian 7s GCC i486-linux-gnu, il est donc tout à fait possible de laisser le champ vide.

Wieland
la source
C'est à peu près ça. Les x86_64-linux-gnuvariétés sont des cibles de raccourci, représentant x86_64-unknown-linux-gnuou x86_64-pc-linux-gnu. gcc -vmontre la cible pour laquelle il a été compilé et config.subdonne le triplet canonique (recherchez-le dans /usr/share/miscles systèmes dérivés de Debian avec autotools-devinstallé).
Stephen Kitt