Comment construisez-vous les anciennes versions de gcc? Erreurs sur crti.o introuvable

10

Comment puis-je créer un ancien gcc (en particulier, 4.5.2) sur Ubuntu 11.10 et éviter les erreurs sur "/ usr / bin / ld: impossible de trouver crti.o: aucun fichier ou répertoire"?

J'ai creusé un peu et trouvé plusieurs éléments similaires, mais aucun ne résout réellement mon problème:

  • J'ai vérifié que tous mes packages (libc6-dev et similaires) sont réinstallés par cette question
  • J'ai vérifié que crti.o existe dans / usr / lib32 et / usr / lib / x86_64-linux-gnu, et que mon ld.so.conf est configuré pour regarder dans ces répertoires
  • J'ai vérifié que l'ajout de mon invocation de make avec LIBRARY_PATH = / usr / lib / x86_64-linux-gnu fonctionne, mais j'aimerais éviter cela (cela devient un point de divergence dans les makefiles)
  • J'ai essayé différentes choses avec --with-build-sysroot, mais sans succès (lire: peut-être que je ne connais pas le bon indicateur à définir)
  • Lors de l'exécution avec strace (selon cette réponse ), je peux voir la référence nue à crti.o:

    13240 open ("crti.o", O_RDONLY) = -1 ENOENT (Aucun fichier ou répertoire de ce type)

Merci!

Mat
la source

Réponses:

7

J'ai eu le même problème. Faire des liens symboliques /usr/libs/crt?.o pour /usr/lib/x86_64-linux-gnu/crt?.orésoudre le problème pour moi.

Yoav
la source
Cela fonctionne, oui. J'espérais une solution qui serait plus proche de peaufiner l'installation de gcc plutôt que de nettoyer les structures de fichiers sous-jacentes, cependant ...
Matt
Je voulais ajouter que dans mon cas, j'ai recompilé glibc et GCC, mais j'ai oublié de me débarrasser d'une ancienne variante de slackware-gcc qui était à / usr / bin /. Lorsque j'ai supprimé ce dernier, j'ai pu à nouveau compiler certaines choses (comme gcc à nouveau).
shevy
10

Même de très nouvelles versions de GCC échouent avec ce message. C'est parce que les nouvelles versions de Debian / Ubuntu prennent en charge le multiarchitecture (c'est-à-dire l'installation de binaires pour plusieurs machines dans un seul système de fichiers), donc les bibliothèques ont été éloignées des emplacements standard.

Il existe des correctifs GCC pour le corriger ici (versions finales non encore approuvées, mais correctes pour Ubuntu), et ils s'appliquent probablement aux anciens GCC sans trop d'effort, peut-être. Je pense que vous devez configurer GCC avec --enable-multiarch , ou quelque chose.

En attendant, la création de liens logiciels est une bonne solution:

cd /usr/lib
ln -s x86_64-linux-gnu/crt*.o .

(le nom du dossier sera différent sur les installations 32 bits).

J'espère que cela pourra aider.

ams
la source
Merci pour le fait que ce soit multiarch. J'espérais une résolution sur "pourquoi" cela a cessé de fonctionner.
Matt
2

J'ai résolu ce problème avec quelques solutions de contournement qui pourraient vous être utiles.

Tout d'abord, compilez GCC avec LIBRARY_PATH=/usr/lib/x86_64-linux-gnu, pour que le processus de démarrage de build sache où trouver les crt?.ofichiers de démarrage.

Ensuite, au lieu de créer des crt?.oliens symboliques /usr/liblà où ils affectent l'ensemble de votre système, vous pouvez lier ces trois fichiers dans le ${prefix}/lib/gcc/...répertoire correspondant au ${prefix}/binrépertoire dans lequel l' gccexécutable est installé. C'est en fait presque en haut de son chemin de recherche pour les fichiers de démarrage, donc il les trouvera - mais ils n'affectent rien d'autre.

Dans mon cas, le répertoire spécifique pour les mettre était lib/gcc/x86_64-unknown-linux-gnu/4.3.2/; vous pouvez trouver le bon car il contient déjà d'autres fichiers comme crtbegin.ocelui-ci.

Brooks Moses
la source
1

J'ai construit GCC 4.1.2 sur Ubuntu precise x86_64. Comme vous l'avez fait, j'ai jeté un œil à la séquence de la dernière commande "xgcc" à la recherche de runtime c 32 bits, grep-ped / 32 / comme suit. Le runtime C dans le mien se trouve dans / usr / lib32 qui est fourni par le paquet libc6-dev-i386.

fgrep /32/ strace-output.txt | grep /usr/lib | head -1
access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32/crti.o", R_OK) = -1 ENOENT (No such file or directory)

J'ai donc créé les liens symboliques crt? .O dans le répertoire recherché par xgcc.

sudo mkdir -p /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
cd /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
sudo ln -s /usr/lib32/crt1.o 
sudo ln -s /usr/lib32/crtn.o 
sudo ln -s /usr/lib32/crti.o 

J'ai réussi à construire GCC 4.1.2 avec.

Naoyuki Tai
la source