GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi clang a-t-il encore besoin de libgcc.a pour compiler mon code ?

Il faut compiler avec l'option -nodefaultlib ou -nostdlibs .

Voici une citation de la documentation de GCC (l'interface clang est la même) :

Une des bibliothèques standard contournées par -nostdlib et -nodefaultlibs est libgcc.a , une bibliothèque de sous-programmes internes que GCC utilise pour surmonter les lacunes de machines particulières ou les besoins particuliers de certains langages.

Vous devrez peut-être exécuter des routines d'initialisation statiques c++ et/ou utiliser ce qui est fourni par les fichiers objets crt<x>.o dans le répertoire lib. Ces fichiers font partie de libc et fournit un point d'entrée exécutable.


Clang n'est pas fourni avec un éditeur de liens, il s'appuie sur ld Au lieu. Et ld dépend de libgcc.a et/ou libgcc.so sur votre système (qu'il s'agisse de l'éditeur de liens LLVM ld.lld ou GNU ld). C'est la raison pour laquelle vous avez ce message d'erreur.

La réponse est donc :

(a) l'éditeur de liens nécessite que libgcc fasse son propre travail de liaison

Beaucoup plus de détails à ce sujet sont disponibles ici sur omniprog.info :

Si nous voulons nous débarrasser de GCC et utiliser clang comme compilateur par défaut sur le système, nous devrons peut-être faire quelques ajustements sur certains systèmes basés sur RPM. Clang ne fournit pas de lien, mais s'appuie sur le lien du système, généralement ld, pour lier les exécutables. C'est le cas même sur les systèmes FreeBSD et Mac OS X où Clang est le compilateur par défaut. Nous pouvons le voir en utilisant l'option -v de clang++. Désormais, ld ne fonctionnera plus sans les fichiers suivants :

libgcc.a
libgcc_s.so
[...]


Linux
  1. Pourquoi vous devez supprimer ifconfig pour ip

  2. Qu'est-ce qu'un serveur Linux et pourquoi votre entreprise en a-t-elle besoin ?

  3. Hachage de mot de passe et pourquoi nous en avons besoin

  4. Pourquoi l'heure Unix commence-t-elle au 1970-01-01 ?

  5. Pourquoi Rsync échoue-t-il avec un tuyau cassé (32), erreur dans le socket Io (code 10) à Io.c (820) ??

Pourquoi stdout a-t-il besoin d'un vidage explicite lorsqu'il est redirigé vers un fichier ?

Que fait si [[ $ ? -ne 0 ]] ; signifie en .ksh

Clang peut-il compiler du code avec des bibliothèques .a compilées par GCC ?

Pourquoi avons-nous besoin du fichier .so.1 sous Linux ?

Pourquoi clang génère-t-il du texte inintelligible lorsqu'il est redirigé ?

Pourquoi un périphérique RAID 10 doit-il être initialisé ?