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!

Matt
quelle

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.

Yoav
quelle
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.

ams
quelle
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.

Brooks Moses
quelle
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.

Naoyuki Tai
quelle