Wie erstellt man ältere gcc-Versionen? Fehler, dass crti.o nicht gefunden wird

Wie erstellt man ältere gcc-Versionen? Fehler, dass crti.o nicht gefunden wird

Wie kann ich einen älteren gcc (insbesondere 4.5.2) auf Ubuntu 11.10 erstellen und Fehler wie „/usr/bin/ld: crti.o kann nicht gefunden werden: Keine solche Datei oder kein solches Verzeichnis“ vermeiden?

Ich habe ein bisschen nachgeforscht und mehrere ähnliche Artikel gefunden, aber keiner löst mein Problem wirklich:

  • Ich habe überprüft, dass alle meine Pakete (libc6-dev und dergleichen) neu installiert wurdendiese Frage
  • Ich habe überprüft, dass 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 sucht.
  • 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 (es wird zu einem divergierenden Punkt in Makefiles).
  • Ich habe verschiedene Dinge mit --with-build-sysroot probiert, aber ohne Erfolg (lies: vielleicht weiß ich einfach nicht, welches Flag ich setzen muss)
  • Beim Ausführen mit strace (gemäßdiese Antwort), kann ich den bloßen Verweis auf crti.o erkennen:

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

Danke!

Antwort1

Sogar sehr neue Versionen von GCC schlagen mit dieser Meldung fehl. Das liegt daran, dass die neuen Debian-/Ubuntu-Versionen Multiarch unterstützen (d. h. die Installation von Binärdateien für mehrere Maschinen in einem Dateisystem) und die Bibliotheken daher von den Standardorten weg verschoben wurden.

Es gibt GCC-Patches, um das Problem zu behebenHier(noch keine freigegebenen Endversionen, aber korrekt für Ubuntu), und sie sind wahrscheinlich ohne großen Aufwand auf ältere GCC anwendbar, vielleicht. Ich denke, Sie müssen GCC mit konfigurieren--enable-multiarch, 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 .

(bei 32-Bit-Installationen ist der Ordnername anders).

Hoffentlich hilft das.

Antwort2

Ich hatte das gleiche Problem. Das Erstellen symbolischer Links von /usr/libs/crt?.o nach /usr/lib/x86_64-linux-gnu/crt?.ohat das Problem für mich gelöst.

Antwort3

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

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

Anstatt dann crt?.osymbolische Links dort zu erstellen /usr/lib, wo sie Ihr gesamtes System betreffen, können Sie diese drei Dateien in dem ${prefix}/lib/gcc/...Verzeichnis symbolisieren ${prefix}/bin, das dem Verzeichnis entspricht gcc, in dem die ausführbare Datei installiert ist. Das ist eigentlich fast ganz oben im Suchpfad für die Startdateien, sodass sie gefunden werden – aber sie haben keine weiteren Auswirkungen.

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

Antwort4

Ich habe GCC 4.1.2 auf Ubuntu precise x86_64 erstellt. Wie Sie habe ich mir den Strace des letzten Befehls „xgcc“ angesehen und nach einer 32-Bit-C-Runtime gesucht. Ich habe /32/ wie folgt grep-ped. Die C-Runtime in meinem befindet sich in /usr/lib32, das 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 symbolischen Links zu crt?.o in dem von xgcc gesuchten Verzeichnis erstellt.

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 GCC 4.1.2 damit erfolgreich erstellt.

verwandte Informationen