Wie baut man ältere gcc-Versionen? Fehler über crti.o wurden nicht gefunden


10

Wie kann ich ein älteres gcc (speziell 4.5.2) unter Ubuntu 11.10 erstellen und Fehler in Bezug auf "/ usr / bin / ld: crti.o: Keine solche Datei oder kein solches Verzeichnis finden" vermeiden?

Ich habe ein bisschen gegraben und mehrere ähnliche Gegenstände gefunden, aber keine, die mein Problem tatsächlich lösen:

  • Ich habe überprüft, ob alle meine Pakete (libc6-dev und dergleichen) gemäß dieser Frage neu installiert wurden
  • Ich habe überprüft, ob crti.o in / usr / lib32 und / usr / lib / x86_64-linux-gnu vorhanden ist und dass meine ld.so.conf so konfiguriert ist, dass sie in diesen Verzeichnissen angezeigt wird
  • Ich habe überprüft, dass das Voranstellen meines Make-Aufrufs mit LIBRARY_PATH = / usr / lib / x86_64-linux-gnu funktioniert, möchte dies jedoch vermeiden (dies wird zu einem divergierenden Punkt in Makefiles).
  • Ich habe verschiedene Dinge mit --with-build-sysroot ausprobiert, aber ohne Erfolg (lesen Sie: Vielleicht weiß ich einfach nicht, welche Flagge ich setzen soll)
  • Wenn ich mit Strace laufe (gemäß dieser Antwort ), kann ich den bloßen Verweis auf crti.o sehen:

    13240 open ("crti.o", O_RDONLY) = -1 ENOENT (Keine solche Datei oder kein solches Verzeichnis)

Vielen Dank!

Antworten:


7

Ich hatte das gleiche Problem. Herstellung von symbolischen Links aus /usr/libs/crt?.o zu /usr/lib/x86_64-linux-gnu/crt?.olösen das Problem für mich.


Das funktioniert ja. Ich hatte auf eine Lösung gehofft, die eher der Optimierung der gcc-Installation entsprach, als sich mit den zugrunde liegenden Dateistrukturen herumzuschlagen ...
— Matt

Ich wollte hinzufügen, dass ich in meinem Fall glibc und GCC neu kompiliert habe, aber ich habe vergessen, eine ältere Slackware-gcc-Variante loszuwerden, die sich unter / usr / bin / befand. Wenn ich letzteres entfernte, konnte ich bestimmte Dinge erneut kompilieren (z. B. gcc erneut).
— Shevy

10

Selbst sehr neue Versionen von GCC schlagen mit dieser Meldung fehl. Dies liegt daran, dass die neuen Debian / Ubuntu-Versionen Multiarch unterstützen (dh Binärdateien für mehrere Computer in einem Dateisystem installieren), sodass die Bibliotheken von den Standardpositionen entfernt wurden.

Es gibt GCC Patches , es zu beheben hier (noch nicht endgültige Fassung genehmigt, aber richtig für Ubuntu), und sie wahrscheinlich zu älteren GCC ohne viel Aufwand anwenden, vielleicht. Ich denke, Sie müssen GCC mit --enable-multiarch konfigurieren oder so.

In der Zwischenzeit ist das Erstellen von Softlinks eine gute Lösung:

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

(Der Ordnername unterscheidet sich bei 32-Bit-Installationen.)

Ich hoffe, das hilft.


Vielen Dank für den Punkt, dass es Multiarch ist. Ich hatte auf eine Lösung gehofft, warum es nicht mehr funktioniert.
— Matt

2

Ich habe dieses Problem mit einigen Problemumgehungen gelöst, die für Sie nützlich sein könnten.

Erstellen Sie zunächst GCC mit LIBRARY_PATH=/usr/lib/x86_64-linux-gnu, damit der Build-Bootstrap-Prozess weiß, wo sich die crt?.oStartdateien befinden.

Anstatt crt?.oSymlinks /usr/libdort zu erstellen, wo sie Ihr gesamtes System betreffen, können Sie diese drei Dateien mit dem ${prefix}/lib/gcc/...Verzeichnis verknüpfen, das dem Verzeichnis entspricht, in dem ${prefix}/bindie gccausführbare Datei installiert ist. Das befindet sich also fast ganz oben auf dem Suchpfad für die Startdateien es wird sie finden - aber sie beeinflussen nichts anderes.

In meinem Fall war das spezifische Verzeichnis, in das sie gestellt werden sollten lib/gcc/x86_64-unknown-linux-gnu/4.3.2/; Sie können die richtige finden, da sie bereits andere Dateien enthält crtbegin.o.


1

Ich habe GCC 4.1.2 auf Ubuntu präzise x86_64 erstellt. Wie Sie habe ich mir die Liste des letzten Befehls "xgcc" angesehen und nach 32-Bit-c-Laufzeit, grep-ped / 32 /, gesucht. Die C-Laufzeit in meiner ist in / usr / lib32, die vom Paket libc6-dev-i386 bereitgestellt wird.

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)

Also habe ich die crt? .O-Symlinks in dem Verzeichnis erstellt, nach dem xgcc gesucht hat.

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 

Ich habe damit erfolgreich GCC 4.1.2 erstellt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.